如何更新 ConcurrentHashMap 线程安全中的值

Mat*_*oer 6 java thread-safety concurrenthashmap

我需要更新 ConcurrentHashmap 中的值,但我不确定如何确保线程安全。

Hashmap 是一个 ConcurrentHashMap,我需要获取自定义类的实例,对其执行一些操作,然后将更新后的值放回。

有什么方法可以将这种 get-alter-put 操作结合到原子操作中吗?

提前致谢

Deb*_*was -1

您可以使用 ConcurrentHashMapscomputeIfPresent https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#computeIfPresent-K-java.util.function.BiFunction-

但由于computeIfPresent是一个成本高昂的操作,因为它是原子操作,并且一些更新操作在BiFunction的计算期间将被其他线程阻塞。您可以通过对并发哈希图执行读取操作来排除这种情况,该操作非常快,如果返回不为 null ,则调用computeIfPrsent

下面的代码获取键“1”的值并向其添加 100,然后以原子方式放回地图

ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
        map.put(1,100);
        Integer value = map.get(1);
        if (value != null)
            map.computeIfPresent(1, (key, oldValue) -> oldValue + 100);
    }
Run Code Online (Sandbox Code Playgroud)

  • 我可能是错的,但是map.get和computeifpresent的分离不会破坏原子性吗?在此期间,地图中的值不会发生变化吗? (3认同)