【问题标题】:java ConcurrentHashMap of Integer vs HashMap of AtomicInteger vs ConcurrentHashMap of AtomicIntegerjava Integer的ConcurrentHashMap vs AtomicInteger的HashMap vs AtomicInteger的ConcurrentHashMap
【发布时间】:2020-04-30 19:48:46
【问题描述】:

我对java中的并发数据结构有疑问,具体来说:

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

如果我理解正确:

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

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

3) 我认为从逻辑的角度来看和第一种情况是一样的

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

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

【问题讨论】:

  • 主要区别在于AtomicInteger 是可变的,而Integer 不是。因此,要更新(Concurrent)HashMap&lt;?, Integer&gt; 中的条目,必须更新put(...),而在(Concurrent)HashMap&lt;?, AtomicInteger&gt; 中,可以更新值而不需要put 更新后的值。

标签: java multithreading java.util.concurrent


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2015-10-20
    相关资源
    最近更新 更多