**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後,默認序列化機制就會忽略該字段。