2013-10-17 61 views
8

黑體內部鎖定有什麼不同,客戶端鎖定&外部鎖定?不同b/w內部鎖定,客戶端鎖定和外部鎖定?

什麼是創建線程安全類的最佳方式?

哪種鎖定是首選&爲什麼?

+0

的[用的是什麼「私人最終的可能重複對象「鎖定在Java多線程?](http://stackoverflow.com/questions/19419702/what-is-the-use-of-private-final-object-locking-in-java-multithreading) – Dirk

+0

嗨德克,請不要將其標記爲重複。這是一個與其他問題不同的問題。這些不相關。我已經從另一張貼出來。順便說一下,我沒有得到任何適當的和令人滿意的答案在其他發佈的問題 –

回答

1

這裏有一些鏈接,討論不同的鎖定方案:

Explicit versus Intrinsic

Client side locking and when to avoid it

我不知道,有一個是「最佳」的方式來創建一個線程安全的類,它取決於你想要達到的目標。通常,您不必使整個班級線程安全,只保護不同線程都可訪問的資源,例如常用列表等。

2

顯式 - 使用併發鎖定實用程序(如鎖定界面)進行鎖定。例如 - 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); 
    } 
} 
6

的我會強烈建議您布賴恩戈茨閱讀「Java Concurrency In Practice」。這是一本很棒的書,可以幫助你理解關於併發的所有概念!

關於您的問題,我不確定我是否可以回答所有問題,但我可以試一試。大多數情況下,如果問題是「什麼是最好的鎖定方式」等,答案總是取決於你試圖解決什麼問題。

問題1:

您嘗試比較這裏不完全可比什麼;

Java提供了一個內置鎖定機制,​​塊。爲了同步的目的,每個對象都可以隱含地充當鎖;這些內置鎖被稱爲固有鎖

術語intrinsic有趣的是鎖的所有權是每個線程而不是每個方法調用。這意味着在給定的時間只有一個線程可以保持鎖定。你也許會覺得有趣的是術語reentrancy,它允許同一個線程再次獲得相同的鎖定。內在鎖可重入。

客戶端鎖定,如果我明白你的意思,是不同的。如果您沒有線程安全課程,您的客戶需要注意這一點。他們需要持有鎖,以確保沒有任何競爭條件。

外在鎖定是不是使用內置的synchronized塊,讓你隱式的鎖,專門用明確鎖機制。這是一種更加複雜的鎖定方式。有很多優點(例如,您可以設置優先級)。一個很好的出發點是java documentation about locks

問題2: 這取決於:)最簡單的,我是儘量保持一切不變。當東西是不可改變的,我並不需要關心線程安全了

問題3: 我有點回答了你的第一個問題