簡體   English   中英

ConcurrentHashMap put() 方法可以不是線程安全的嗎?

[英]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.

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