[英]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
的代碼不起作用......在作者的意思上。
是的, get
和put
方法確實會鎖定整個表。 但是這些方法只在操作期間持有鎖。 在get
和put
之間,上面的代碼將釋放hashTable
上的鎖,然后重新獲取它。
這意味着第二個線程可以調用put
為鍵放置不同的值。 序列可能如下所示:
hashtable.get("a")
-> null
hashtable.get("a")
-> null
hashtable.put("a", 1)
hashtable.put("a", 2)
我們已經為同一個鍵調用put
兩次不同的值。
哪個線程會“贏”? 一般來說,我們不能說。 這取決於精確的時間和其他因素。 這是不可預測的。
因此,如果預期的行為是第一個調用get
的線程應該總是獲勝,那么這不是線程安全的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.