编程语言
首页 > 编程语言> > java-ConcurrentHashMap更新存在值线程安全

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

作者:互联网

我想使用包含一些结果的并发哈希图,

ConcurrentHashMap<Long,AtomicInteger>

如果键不存在,则添加一个新条目,或者按键和增量获取值,如下所示:

if(map.contains(key))
  map.get(key).addAndGet(1);
else
  map.put(key,new AtomicInteger(1));    

放置操作不安全,该如何解决?放置操作应在同步块内吗?

解决方法:

put()操作本身是以线程安全的方式实现的,即,如果您输入相同的密钥,它将在内部进行同步.

但是,调用不是,即两个线程可以同时添加一个新密钥.您可以尝试putIfAbsent(),如果获得返回值(即不为null),则可以调用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(取决于您对该值所做的其他操作).

标签:multithreading,java-util-concurrent,java
来源: https://codeday.me/bug/20191118/2031535.html