簡體   English   中英

Java嵌套的ConcurrentHashMap線程安全嗎?

[英]Java nested ConcurrentHashMap is it thread safe?

所以這是實現..

public ConcurrentMap<String , ConcurrentMap<String, Object>> map = new ConcurrentHashMap<>();

public void put(String subKey, String key, Object value) {
    map.putIfAbsent(subKey, new ConcurrentHashMap<>());
    map.get(subKey).put(key, value);
}

public Object get(String subKey, String key) {
    return map.get(subKey) == null ? null : map.get(subKey).get(key);
}

看起來很線程安全

  • PutIfAbsent是原子操作。
  • 然后,我認為,獲取內部映射和放置值也應該是線程安全的。

感謝您的澄清

put方法中,即使不需要它,也始終在創建一個新的ConcurrentHashMap 那是浪費。

同樣,在put方法中,如果可以通過另一個線程刪除映射鍵,則可以在putIfAbsentget調用之間刪除嵌套的映射,從而導致NullPointerException 改用computeIfAbsent

public void put(String subKey, String key, Object value) {
    map.computeIfAbsent(subKey, k -> new ConcurrentHashMap<>())
       .put(key, value);
}

get方法中,您不應調用get兩次,因為該值可能在第一次調用和第二次調用之間發生變化。 保存值是一個變量:

public Object get(String subKey, String key) {
    ConcurrentMap<String, Object> subMap = map.get(subKey);
    return subMap == null ? null : subMap.get(key);
}

暫無
暫無

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

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