java-ConcurrentHashMap更新存在值线程安全
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-ConcurrentHashMap更新存在值线程安全,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含885字,纯文字阅读大概需要2分钟。
内容图文
我想使用包含一些结果的并发哈希图,
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(取决于您对该值所做的其他操作).
内容总结
以上是互联网集市为您收集整理的java-ConcurrentHashMap更新存在值线程安全全部内容,希望文章能够帮你解决java-ConcurrentHashMap更新存在值线程安全所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。