如果我使用ConcurrentHashMap(其中put是線程安全的),並且我提供了一個使用ConcurrentHashMap的公共函數myPut - 我需要同步我的函數嗎?對線程安全函數的調用是否也需要同步?
含義:是否應該同步?
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
如果我使用ConcurrentHashMap(其中put是線程安全的),並且我提供了一個使用ConcurrentHashMap的公共函數myPut - 我需要同步我的函數嗎?對線程安全函數的調用是否也需要同步?
含義:是否應該同步?
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
併發實用程序(如ConcurrentHashMap)的設計使您無需同步:它們將在內部處理線程安全訪問。
湯姆說的是真實的,你需要考慮地圖參考變化的潛力。如果實際參考不會更改,那麼在實踐中,您將在這裏擺脫它:ConcurrentHashMap的內部同步 - 實際上是一般的java.util.concurrentlibrary - 確保放入映射的對象是安全地發佈到其他線程。但我會同意,即使如此,確定引用是否可以更改也是很好的做法,然後在代碼中明確聲明它(如果不能,則爲'final';如'volatile'或AtomicReference能夠)。
號
您可以CAL myPut一次多次。
這個put會一次調用一個,因爲HashTable的訪問需要一次一個。 (另請參閱併發寫入共享內存)
如果使用ConcurrentHashMap,則不應該同步'put',但這並不意味着您的'puts'將一次調用一次。這取決於你的併發水平Map ...
所以你必須知道你想要什麼。
BTW看看在ConcurrentHashTable的Javadoc,一切都很好解釋......
-Patrick
這要看情況。
當您編寫將從多個線程使用的對象的類時,整個遊戲會發生變化。如果您希望提供任何線程安全保證,您需要了解您嘗試實現的結果。
在這種情況下,如果這是您的類中唯一的方法,那麼在同步對此方法的訪問方面沒有意義。但它不會是唯一的方法 - 因爲這會讓班級變得毫無意義。
如果您需要這樣做,只需要同步此方法以使其他原因的類安全,那麼您可能需要質疑ConcurrentHashMap
的開銷是否值得。
由於map
引用未聲明final
它可能會更改。因此,這裏有一個潛在的線程錯誤。
如果map
應該是一個可變引用,那麼您將需要做更多的工作。否則使用final
。的確,儘可能地使用final
,即使它不「容易」。 「final
是新的[舊] private
。」你可能想要製作map
private
,也是通用的。