2008-11-19 65 views
3

如果我使用ConcurrentHashMap(其中put是線程安全的),並且我提供了一個使用ConcurrentHashMap的公共函數myPut - 我需要同步我的函數嗎?對線程安全函數的調用是否也需要同步?

含義:是否應該同步?

ConcurrentHashMap map; 
public void myPut(int something) { 
    this.map.put(something); 
} 

回答

2

併發實用程序(如ConcurrentHashMap)的設計使您無需同步:它們將在內部處理線程安全訪問。

湯姆說的是真實的,你需要考慮地圖參考變化的潛力。如果實際參考不會更改,那麼在實踐中,您將在這裏擺脫它:ConcurrentHashMap的內部同步 - 實際上是一般的java.util.concurrentlibrary - 確保放入映射的對象是安全地發佈到其他線程。但我會同意,即使如此,確定引用是否可以更改也是很好的做法,然後在代碼中明確聲明它(如果不能,則爲'final';如'volatile'或AtomicReference能夠)。

0


您可以CAL myPut一次多次。
這個put會一次調用一個,因爲HashTable的訪問需要一次一個。 (另請參閱併發寫入共享內存)

1

如果使用ConcurrentHashMap,則不應該同步'put',但這並不意味着您的'puts'將一次調用一次。這取決於你的併發水平Map ...

所以你必須知道你想要什麼。

BTW看看在ConcurrentHashTable的Javadoc,一切都很好解釋......

-Patrick

0

這要看情況。

當您編寫將從多個線程使用的對象的類時,整個遊戲會發生變化。如果您希望提供任何線程安全保證,您需要了解您嘗試實現的結果。

在這種情況下,如果這是您的類中唯一的方法,那麼在同步對此方法的訪問方面沒有意義。但它不會是唯一的方法 - 因爲這會讓班級變得毫無意義。

如果您需要這樣做,只需要同步此方法以使其他原因的類安全,那麼您可能需要質疑ConcurrentHashMap的開銷是否值得。

4

由於map引用未聲明final它可能會更改。因此,這裏有一個潛在的線程錯誤。

如果map應該是一個可變引用,那麼您將需要做更多的工作。否則使用final。的確,儘可能地使用final,即使它不「容易」。 「final是新的[舊] private。」你可能想要製作mapprivate,也是通用的。

相關問題