簡體   English   中英

ConcurrentHashMap:在Java中的嵌套並發HashMap上使用merge()

[英]ConcurrentHashMap: Using merge() on a nested concurrentHashMap in Java

我有一個並發HashMap像這樣:

ConcurrentHashMap<String, ConcurrentHashMap<Long, Long>> hashMap = new ConcurrentHashMap<>()

如果已經存在,我需要根據當前值更新嵌套哈希圖的值。 我目前正在做這樣的事情:

 if (hashMap.containsKey("key")) {

        long count = (hashMap.get("key").containsKey(longKey)) ?
                    (hashMap.get("key").get(longKey) + 1l) :
                    1l;

        hashMap.put("key", new ConcurrentHashMap<Long, Long>() {{
            put(longKey, count);
        }});
    }

基本上,檢查是否存在“鍵”,然后檢查longKey是否存在於嵌套的並發HashMap中,如果是,則將所有1l都保留為現有值。 否則,放1升。 如果不存在“鍵”,則使用新值創建一個新的currentHashMap。

如何使用合並方法https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#merge-KV-java.util.function.BiFunction-執行相同的操作? 因為我希望獲取和更新是原子的。

據我了解的問題,您可以使用以下代碼以線程安全的方式執行此操作:

Map<Long, Long> longMap =
    hashMap.computeIfAbsent("key", k -> new ConcurrentHashMap<>());
longMap.merge(longKey, 1L, Long::sum);

您應該認真考慮僅使用純同步。 如果您沒有編寫線程安全代碼的經驗,那么簡單同步就容易得多。 例如,如果您使用Collections.synchronizedMap ,則您可以在需要執行多個(而不是單個方法)調用的任何時間進行synchronized (map) {...}

暫無
暫無

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

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