java ConcurrentHashMap of Integer vs HashMap of AtomicInteger vs ConcurrentHashMap of AtomicInteger

标签 java multithreading java.util.concurrent

我对java中的并发数据结构有疑问,特别是:

1) ConcurrentHashMap<String, Integer>
2) HashMap<String, AtomicInteger>
3) ConcurrentHashMap<String, AtomicInteger>

如果我理解正确的话:

1) 读/写是线程安全的,只有一个线程可以对一对夫妇执行写操作(应该允许所有线程读取),因此如果另一个线程要修改另一对夫妇(与以前不同),则必须等待获取锁。

2)每个线程都可以访问 AtomicInteger 值(当然是为了读取),但是两个线程可以同时修改不同的值。

3)我认为从逻辑角度来看与第一种情况相同

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

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

最佳答案

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

将 AtomicInteger 作为 HashMap 的值允许多个线程安全地修改映射中已有的值。

因此:如果您的映射是静态的(构建后就不会添加/删除任何内容),则具有 AtomicInteger 的 HashMap 可以安全地以最小的开销使用。

如果您向 map 添加项目或从 map 删除项目,请使用 ConcurrentHashMap。如果使用 Integer,则必须将值设置到映射中才能修改它。如果您使用AtomicInteger,则只需设置整数值即可。

关于java ConcurrentHashMap of Integer vs HashMap of AtomicInteger vs ConcurrentHashMap of AtomicInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61531552/

相关文章:

java - 无法解决JPQL :parameter problem by using FUNC()

java - hive 如何查找给定的十进制值与定义的十进制类型不正确并返回 NULL

java - ScheduledExecutorService:如何捕获它的异常?

java - 如何处理来自 Callable<Void> 的异常

java - 在 run() 中中断当前线程不会抛出 InterruptedException

java - 对以 map 作为输入的列表进行排序

java - XPages:从 managedBean 读取私有(private)属性失败

java - 在 Scala 中执行多线程的推荐方法是什么

java - 如何根据从其他线程中长时间运行的任务收到的​​通知更新 JTable?

java - 如何杀死Javafx中的所有/特定后台线程?