首页 > 解决方案 > 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)我认为从逻辑角度来看与第一种情况相同

以上三种数据结构的主要区别是什么?

在每个线程应该同时增加/减少整数值的多线程情况下,最好的选择是什么?

标签: javamultithreadingjava.util.concurrent

解决方案


当您在地图中添加/删除项目时,可以从多个线程安全地使用 ConcurrentHashMap。HashMap 不是。多个线程可以读取但只有一个可以写入,并且在写入期间没有其他线程应该读取。

将 AtomicInteger 作为哈希映射的值允许多个线程安全地修改映射中已经存在的值。

所以:如果你的地图是静态的(一旦你构建它就不会添加/删除任何东西),带有 AtomicInteger 的 HashMap 可以安全使用,并且开销最小。

如果您在地图中添加/删除项目,请使用 ConcurrentHashMap。如果使用 Integer,则必须将值设置为 map 才能修改它。如果您使用 AtomicInteger,您可以简单地设置整数值。


推荐阅读