java - java Integer的ConcurrentHashMap vs AtomicInteger的HashMap vs AtomicInteger的ConcurrentHashMap
问题描述
我对java中的并发数据结构有疑问,特别是:
1) ConcurrentHashMap<String, Integer>
2) HashMap<String, AtomicInteger>
3) ConcurrentHashMap<String, AtomicInteger>
如果我理解正确:
1)读/写是线程安全的,只有一个线程可以对一对执行写操作(所有线程都应该允许读取),所以如果另一个线程要修改另一对(与以前不同)必须等待获取锁.
2)每个线程都可以访问 AtomicInteger 值(肯定是为了读取),但是两个线程可以同时修改不同的 .
3)我认为从逻辑角度来看与第一种情况相同
以上三种数据结构的主要区别是什么?
在每个线程应该同时增加/减少整数值的多线程情况下,最好的选择是什么?
解决方案
当您在地图中添加/删除项目时,可以从多个线程安全地使用 ConcurrentHashMap。HashMap 不是。多个线程可以读取但只有一个可以写入,并且在写入期间没有其他线程应该读取。
将 AtomicInteger 作为哈希映射的值允许多个线程安全地修改映射中已经存在的值。
所以:如果你的地图是静态的(一旦你构建它就不会添加/删除任何东西),带有 AtomicInteger 的 HashMap 可以安全使用,并且开销最小。
如果您在地图中添加/删除项目,请使用 ConcurrentHashMap。如果使用 Integer,则必须将值设置为 map 才能修改它。如果您使用 AtomicInteger,您可以简单地设置整数值。
推荐阅读
- angular - 将 ObservableArray 传递给模型对话框参数,显示 RadListView 数据具有 [Object Object]
- sql - 从 sql server 中的几个 select 语句返回特定值
- javascript - 爪哇:错误:
属性 y:预期长度,“NaN”。/错误: 属性高度:预期长度,“NaN” - git - 使用 Powershell 下载随机 GitHub 存储库
- python - 如何在 Param / PyViz 中指定跨参数的依赖关系
- mysql - Can't change lower-case-table-names on MariaDB
- javascript - 调整大小事件处理程序上的响应 heatmap.js
- python - Run django-admin
- python - Python2:使用 Popen.communicate() 写入交互式进程的标准输入,没有尾随换行符
- polymer-3.x - 如何部署 prod 捆绑的 Polymer 3 应用程序构建?