回答
這裏有一些鏈接,討論不同的鎖定方案:
Client side locking and when to avoid it
我不知道,有一個是「最佳」的方式來創建一個線程安全的類,它取決於你想要達到的目標。通常,您不必使整個班級線程安全,只保護不同線程都可訪問的資源,例如常用列表等。
顯式 - 使用併發鎖定實用程序(如鎖定界面)進行鎖定。例如 - ConcurrentHashMap
固有鎖定使用。
客戶端鎖定 - 類似ConcurrentHashMap
不支持客戶端鎖定,因爲get方法沒有使用任何類型的鎖。所以雖然你把一個鎖放在它的對象上,像synchronized(ConcurrentHashMap
的對象),但其他一些線程仍然可以訪問ConcurrentHashMap
的對象。
擁有所有set get方法的類Explicit或Intrinsic鎖支持客戶端鎖定。由於某些客戶端代碼來鎖定該對象。下面是例如矢量
public static Object getLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
return list.get(lastIndex);
}
}
public static void deleteLast(Vector list) {
synchronized (list) {
int lastIndex = list.size() - 1;
list.remove(lastIndex);
}
}
的我會強烈建議您布賴恩戈茨閱讀「Java Concurrency In Practice」。這是一本很棒的書,可以幫助你理解關於併發的所有概念!
關於您的問題,我不確定我是否可以回答所有問題,但我可以試一試。大多數情況下,如果問題是「什麼是最好的鎖定方式」等,答案總是取決於你試圖解決什麼問題。
問題1:
您嘗試比較這裏不完全可比什麼;
Java提供了一個內置鎖定機制,塊。爲了同步的目的,每個對象都可以隱含地充當鎖;這些內置鎖被稱爲固有鎖。
術語intrinsic
有趣的是鎖的所有權是每個線程而不是每個方法調用。這意味着在給定的時間只有一個線程可以保持鎖定。你也許會覺得有趣的是術語reentrancy
,它允許同一個線程再次獲得相同的鎖定。內在鎖是可重入。
客戶端鎖定,如果我明白你的意思,是不同的。如果您沒有線程安全課程,您的客戶需要注意這一點。他們需要持有鎖,以確保沒有任何競爭條件。
外在鎖定是不是使用內置的synchronized塊,讓你隱式的鎖,專門用明確鎖機制。這是一種更加複雜的鎖定方式。有很多優點(例如,您可以設置優先級)。一個很好的出發點是java documentation about locks
問題2: 這取決於:)最簡單的,我是儘量保持一切不變。當東西是不可改變的,我並不需要關心線程安全了
問題3: 我有點回答了你的第一個問題
- 1. ActiveMQ .net客戶端鎖定
- 2. 字體鎖定爲SQL-MODE ORG-MODE的內部不FONT-鎖定
- 3. 內DIV鎖定,以降低外部DIV
- 4. 從外部函數鎖定和ref值
- 5. C#鎖定或不鎖定
- 6. 鎖(objectReference){}沒有鎖定關鍵部分
- 7. ldap - 鎖定/解鎖帳戶
- 8. Perforce「鎖定客戶端」錯誤
- 9. 將一個表鎖鎖定行鎖定
- 10. 用VBA鎖定和解鎖
- 11. 屏幕鎖定和解鎖
- 12. 鎖定用戶
- 13. 加載外部app.config是否鎖定它?
- 14. 如何鎖定對外部進程
- 15. BroadcastReceiver的部分鎖定?
- 16. Python鎖定關鍵部分
- 17. 鎖定和驗證或鎖定?
- 18. 提升內部讀寫器鎖定
- 19. Linux JVM上對象的內部鎖定
- 20. 陣列內部元素的Java鎖定
- 21. PostgreSQL和鎖定
- 22. free_netdev和鎖定
- 23. Eventlet和鎖定
- 24. 同步線程和鎖定
- 25. 鎖定和同步問題
- 26. Django帳戶鎖定
- 27. SystemEvents.SessionSwitch哪個用戶被鎖定/解鎖
- 28. Java同步/鎖定
- 29. 同步塊鎖定
- 30. 鎖定性能:鎖定更長時間與鎖定更經常
的[用的是什麼「私人最終的可能重複對象「鎖定在Java多線程?](http://stackoverflow.com/questions/19419702/what-is-the-use-of-private-final-object-locking-in-java-multithreading) – Dirk
嗨德克,請不要將其標記爲重複。這是一個與其他問題不同的問題。這些不相關。我已經從另一張貼出來。順便說一下,我沒有得到任何適當的和令人滿意的答案在其他發佈的問題 –