java 內在鎖(intrinsic lock)或者監視器鎖(monitor lock)
阿新 • • 發佈:2018-12-30
1. 同步方法中的鎖
當執行緒呼叫同步方法時,它自動獲得這個方法所在物件的內在鎖,並且方法返回時釋放鎖,如果發生未捕獲的異常,也會釋放鎖。
當呼叫靜態同步方法時,因為靜態方法和類相關聯,執行緒獲得和這個類關聯的Class物件的內在鎖。
使用內在鎖後,把deposit方法和withdraw方法修改為同步方法,就可以避免執行緒干擾。
public synchronized void deposit(int amount) {
balance = balance + amount;
}
public synchronized void withdraw(int amount) {
balance = balance - amount;
}
2. 同步語句
同步語句必須指定提供內在鎖的物件,其基本用法如下:
synchronized(提供鎖的物件){
臨界程式碼
}
用同步語句修改BankAccount類中的方法如下:
public void deposit(int amount) {
synchronized (this) {
balance = balance + amount;
}
}
public void withdraw(int amount) {
synchronized (this) {
balance = balance - amount;
}
}
3. 同步類
把synchronized關鍵字放在類的前面,這個類中的所有方法都是同步方法。
4. 可重入同步
執行緒可以獲得他已經擁有的鎖,執行執行緒多次獲得同一個鎖,就是可以重入(reentrant)同步。這種情況通常是同步程式碼直接或者間接的呼叫也包含了同步程式碼的方法,並且兩個程式碼集都使用同一個鎖。如果沒有可重入同步,那麼,同步程式碼就必須採取很多額外的預防措施避免執行緒阻塞自己。java java.util.concurrent 包中的 ReentrantLock 即為可重入鎖