3
A
回答
7
你的意思是synchronized語句和methods關鍵字嗎?隱式鎖定的主要優點是需要更少的代碼,並在離開其範圍時自動解鎖。對於簡單的鎖定/等待操作來說,這是完美的解決方案
所以下面的代碼
public void myMethod() {
synchronized(this) {
// concurrent stuff
}
}
完全等價於
final private Lock lock = new ReentrantLock();
public void myMethod() {
lock.lock();
try {
// concurrent stuff
}
finally {
lock.unlock();
}
}
和
synchronized public void myMethod() {
// concurrent stuff
}
您還可以使用同步的不同對象(他們沒有受到任何影響,僅作爲控制點):
final static private Object sync = new Object();
public void method1() {
synchronized(sync) {
// concurrent code involving static members
}
}
public void method2() {
synchronized(this) {
// concurrent code affecting this instance
}
}
6
除了@ Shepard的回答,使用不太容易出錯。考慮這些可能導致鎖不能被釋放的錯誤:
final private Lock lock = new ReentrantLock();
public void myMethod() {
lock.lock();
// concurrent stuff
}
public void myMethod2() {
lock.lock();
// concurrent stuff that might throw an unchecked exception
lock.unlock();
}
public void myMethod3() {
lock.lock();
try {
// concurrent stuff
lock.unlock();
} catch (...) {
...
} finally {
...
}
}
第一個可能會出現在測試中,但後兩個可能不會。
你不能用來犯這些錯誤。
然而,儘管Lock
這些考慮是有用的:
鎖,可以實現不同的鎖定策略,如非重入鎖,多讀/單寫鎖。
鎖定允許您在範圍/塊結構邊界上保持鎖定。 (這會讓你的代碼難以推理,但對於某些使用案例是必要的;例如,需要在多個事件處理程序中鎖定的基於事件的設計。)
Lock API允許您測試鎖定,無阻塞地獲取鎖定或超時,並定義對象。
相關問題
- 1. 新的鎖定界面優於Java中的同步塊的優點是什麼?
- 2. Java同步/鎖定
- 3. 同步塊鎖定
- 4. 同步塊不會鎖定
- 5. 鎖定自由同步
- 6. 同步線程和鎖定
- 7. 同步使對象鎖定
- 8. 鎖定和同步問題
- 9. Java同步鎖
- 10. 查詢關於在同步塊上重入鎖定的缺點
- 11. Parallel.Foreach中的同步鎖定問題
- 12. php的同步鎖定文本字段
- 13. ICS上的同步鎖定錯誤
- 14. 優步API集成
- 15. 同步:多重鎖定 - 創建鎖定對象?
- 16. 同步雙重鎖定後鎖定爲Android?
- 17. 同步對象:鎖定代碼與鎖定對象
- 18. 同步/鎖定/ GuardedBy詮釋鎖定實例
- 19. 同步vs鎖vs同步映射
- 20. 如何自定義優步API地圖?
- 21. 指定優步類型我超級Api
- 22. 同步(this)只鎖定同步塊還是全部「this」代碼?
- 23. 如何使用java同步文件操作?同步或鎖定?
- 24. 同步,鎖定與廣播傳遞
- 25. 在java同步方法上鎖定
- 26. Java同步:無阻塞鎖定
- 27. 是否同步保持鎖定
- 28. 同步Ajax請求「鎖定」瀏覽器
- 29. Java同步和Re-Entrant鎖定
- 30. 「Class」類對象鎖定實現同步