簡體   English   中英

Hashtable vs ConcurrentHashMap,答案是否正確,為什么?

[英]Hashtable vs ConcurrentHashMap, is the answer correct, why?

我在某處讀到了關於用 ConcurrentHashMap 替換 Hashtable:

由於 Hashtable 鎖定整個 Map 而不是 Map 的一部分,因此 if(Hashtable.get(key) == null) put(key, value) 等復合操作在 Hashtable 中有效,但在 concurrentHashMap 中無效。 而不是這個使用 ConcurrentHashMap 的 putIfAbsent() 方法

既然get和put之間有差距,那hashtable為什么會起作用呢?

if( Hashtable.get (key) == null) put (key, value)

在您的問題中,您將此作為事實引用:

“由於Hashtable鎖定整個Map而不是Map的一部分,因此if (hashtable.get(key) == null) hashtable.put(key, value)等復合操作在Hashtable中有效,但在ConcurrentHashMap中無效。”

不幸的是,這是不正確的。 使用Hashtable的代碼不起作用......在作者的意思上。

是的, getput方法確實會鎖定整個表。 但是這些方法只在操作期間持有鎖。 getput之間,上面的代碼將釋放hashTable上的鎖,然后重新獲取它。

這意味着第二個線程可以調用put為鍵放置不同的值。 序列可能如下所示:

  1. 線程 A - hashtable.get("a") -> null
  2. 線程 B - hashtable.get("a") -> null
  3. 線程 B - hashtable.put("a", 1)
  4. 線程 A - hashtable.put("a", 2)

我們已經為同一個鍵調用put兩次不同的值。

哪個線程會“贏”? 一般來說,我們不能說。 這取決於精確的時間和其他因素。 這是不可預測的。

因此,如果預期的行為是第一個調用get的線程應該總是獲勝,那么這不是線程安全的實現。

暫無
暫無

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

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