簡體   English   中英

java.util.Hashtable線程安全嗎?

[英]Is java.util.Hashtable thread safe?

自從我將哈希表用於任何重要的事情以來已經有一段時間了,但是我似乎想起了get()和put()方法是同步的。

JavaDocs沒有反映這一點。 他們只是說類Hashtable是同步的。 我該怎么辦? 如果多個線程同時訪問哈希表(假設它們沒有修改同一條目),則操作將成功,對嗎? 我想我要問的是“ java.util.Hashtable線程安全嗎?”

請指導我擺脫這個問題...

它是線程安全的,因為get,put,contains方法等是同步的。 此外,無論它們正在修改哪些條目,多個線程將無法同時訪問哈希表。

編輯-修改為包括以下條件:同步使哈希表在內部成為線程安全的,因為它被原子地修改了; 它不能防止外部代碼中由於多個線程同時訪問哈希表而導致的競爭條件。

對於一般用途,它是線程安全的。

但是您必須了解它確實使您的應用程序邏輯圍繞線程安全。 例如,考慮實現在地圖中放置值(如果尚不存在)。 這個習語稱為putIfAbsent。 單獨使用HashTable很難以線程安全的方式實現這一點。 對於成語來說,類似的是replace(k,V,V)。

因此,對於某些習慣用法,例如putIfAbsent和and replace(K,V,V) ,我建議使用ConcurrentHashMap

哈希表已棄用。 算了吧。 如果要使用同步集合,請為此使用Collections.syncrhonize *()包裝器。 但是不推薦這些。 在Java 5中,已經實現了6種新的並發算法。 寫時復制,CAS,無鎖算法。 對於Map接口,有兩個並發實現。 ConcurrentHashMap(並發哈希圖)和ConcurrentSkipListMap-並發排序圖實現。

第一個針對讀取進行了優化,因此即使在更新表時也不會阻止檢索。 與同步包裝程序相比,寫入操作還快得多,這是因為ConcurrentHashMap不是由一個表而是由一組稱為段的表組成的。 可以通過構造函數中的最后一個參數進行管理:

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor,
                         int concurrencyLevel);

ConcurrentHashMap在高度並發的上下文中是必不可少的,它的性能遠勝於任何可用的替代方案。

我問“ java.util.Hashtable線程安全嗎?”。

是哈希表是線程安全的,如果您的應用程序中不需要線程安全,則請通過HashMap,以防萬一,如果需要線程安全的實現,那么建議使用ConcurrentHashMap代替Hashtable。

不可以。 只有在同步方法的情況下,它才是“線程安全的”。 但是,它通常不是線程安全的,而且也不是線程安全的,因為導出內部狀態的類(例如Iterators或Enumerations)也需要使用內部狀態進行同步。 這就是為什么新的Collections類同步的原因,因為Java設計人員認識到線程安全取決於類的用戶,而不是類本身。

請注意,很多答案都說明Hashtable已同步。 但這會給你一點點。 同步在訪問器/更改器方法上將停止同時從映射中添加或刪除兩個線程,但是在現實世界中,您經常需要進行額外的同步。

甚至遍歷Hashtable的條目也不是線程安全的,除非您還防止通過其他同步來修改Map。

如果查看Hashtable代碼,您將看到方法已同步,例如:

public synchronized V get(Object key) 
 public synchronized V put(K key, V value)
 public synchronized boolean containsKey(Object key)

您可以按住Control鍵(對於Mac是命令),然后單擊Eclipse中的任何方法名稱以轉到Java源代碼。

與新的集合實現不同, 哈希表是同步的。 * 如果不需要線程安全的實現,建議使用HashMap *代替Hashtable。 如果需要線程安全的高度並發實現 ,則建議使用ConcurrentHashMap代替Hashtable。

http://download.oracle.com/javase/7/docs/api/java/util/Hashtable.html

是的,哈希表線程安全,因此任何時候只有一個線程可以訪問哈希表

另一方面,HashMap不是線程安全的(因此“更快”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM