gpt4 book ai didi

java - ConcurrentHashMap 更新存在值线程安全

转载 作者:行者123 更新时间:2023-12-01 11:06:57 25 4
gpt4 key购买 nike

我想使用并发哈希映射来保存一些结果,

ConcurrentHashMap<Long,AtomicInteger>

如果键不存在,则添加一个新条目,或者通过键和增量获取值,如下所示:
if(map.contains(key))
map.get(key).addAndGet(1);
else
map.put(key,new AtomicInteger(1));

put 操作不安全,如何解决这个问题? put 操作应该在同步块(synchronized block)内吗?

最佳答案

put()操作本身以线程安全的方式实现,即如果您放置相同的键,它将在内部同步。

然而,调用不是,即两个线程可以同时添加一个新 key 。你可以试试putIfAbsent()如果你得到一个返回值(即非空),你可以调用 get 方法。因此,您可以像这样更改代码:

//this only adds a new key-value pair if there's not already one for the key
if( map.putIfAbsent(key,new AtomicInteger(1)) != null ) {
map.get(key).addAndGet(1);
}

或者,如果您使用的是 Java 8,您可以使用 compute()根据 JavaDoc 以原子方式执行的方法。然后,您传递的函数将检查该值是否已经存在。由于整个通话是同步的,您可能甚至不需要使用 AtomicInteger (取决于您对值(value)所做的其他事情)。

关于java - ConcurrentHashMap 更新存在值线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36277743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com