[英]Can ConcurrentHashMap put() method be not thread-safe?
假設我有一個名為 map 的共享 ConcurrentHashMap<String, Integer> 已經只有一個映射(“One”,1),並且還假設我有 2 個線程。
第一個線程執行以下代碼:
map.put("One", 2);
第二個線程執行以下代碼:
synchronized (map) {
Integer number = map.get("One");
System.out.println(number == map.get("One"));
}
由於 ConcurrentHashMap 使用鎖定條帶方法而不是鎖定整個 object 我不認為所描述的場景是線程安全的。 特別是我不知道是否可能存在map.put("One", 2);
的交錯。 在 Integer 之間的第一個線程Integer number = map.get("One");
調用和System.out.println(number == map.get("One"));
盡管兩個線程都在同步塊內,但仍調用第二個線程。
那么該代碼是否有可能打印錯誤?
ConcurrentHashMap
中的所有方法都可能是線程安全的,但這並不意味着它在ConcurrentHashMap
object 本身上同步。 您可以做的是在同一參考上同步put
和 map 訪問代碼。 您的put
代碼必須更改為:
synchronized (map) {
map.put("One", 2);
}
您的訪問代碼可以保持如下:
synchronized (map) {
Integer number = map.get("One");
System.out.println(number == map.get("One"));
}
這將永遠無法打印false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.