阿里實習生java面試

**1、**java多線程實現有哪幾種方式?
2、實現同步有哪些方法?
參考答案:
1)實現Runnable接口、繼承Thread類
由於java不能支持多繼承,所以一般不推薦使用繼承Thread這種方式。
2)
1、同步方法
使用Synchrogazed修飾符,由於java的每個對象都有一個內置鎖,當使用該修飾方法時,內置鎖會保護整個方法,在調用該方法的時候,會獲得該內置鎖,要是該對象的內置鎖已經被別的線程獲取,則會阻塞,等待其釋放。
也可以修飾static方法,則是獲取的鎖是類鎖
2、同步代碼塊
即有synchronized關鍵字修飾的語句塊。
被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步
代碼如:

```
 synchronized(object){ 
    }
```

注:同步是一種高開銷的操作,因此應該儘量減少同步的內容。 通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。

3、使用特殊域變量(volatile)實現線程同步
 a.volatile關鍵字爲域變量的訪問提供了一種免鎖機制, 
    b.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新, 
    c.因此每次使用該域就要重新計算,而不是使用寄存器中的值 
    d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量




 4、使用重入鎖實現線程同步
 lock() : 獲得鎖 
 unlock() : 釋放鎖 
 ```
class Bank {

            private int account = 100;
            //需要聲明這個鎖
            private Lock lock = new ReentrantLock();
            public int getAccount() {
                return account;
            }
            //這裏不再需要synchronized 
            public void save(int money) {
                lock.lock();
                try{
                    account += money;
                }finally{
                    lock.unlock();
                }

            }
        }
```

**3、**java序列化
參考:java序列化的作用是將對象保存爲流或者寫入文件中。已達到持久化,只有實現了java.io.Serializable接口才能被序列化。
transient關鍵字
當某個字段被聲明爲transient後,默認序列化機制就會忽略該字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章