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. 同步塊鎖定
- 3. 鎖定自由同步
- 4. 同步塊不會鎖定
- 5. 同步使對象鎖定
- 6. Java同步鎖
- 7. 優步API集成
- 8. 同步:多重鎖定 - 創建鎖定對象?
- 9. 同步vs鎖vs同步映射
- 10. 指定優步類型我超級Api
- 11. 如何自定義優步API地圖?
- 12. 同步(this)只鎖定同步塊還是全部「this」代碼?
- 13. 雙向收集綁定同步/鎖
- 14. 同步塊 - 鎖定多個對象
- 15. 同步jquery $ .ajax不鎖定IE?
- 16. 同步原語「鎖定一次」
- 17. 同步,鎖定與廣播傳遞
- 18. java同步和對象鎖定
- 19. 在DJango中鎖定和同步
- 20. 鎖定和同步使用互斥
- 21. 是否同步保持鎖定
- 22. 線程併發 - 同步和鎖定。
- 23. 同步鎖定結果集對象嗎?
- 24. 同步Ajax請求「鎖定」瀏覽器
- 25. 同步的方法和鎖
- 26. 的Java Multihreading同步與鎖
- 27. 優勢DB同步
- 28. 異步庫的優點
- 29. Java的「同步」和C#的「鎖定」有什麼不同嗎?
- 30. 爲什麼我的同步方法鎖定不同的對象?