java Integer的ConcurrentHashMap与AtomicInteger的HashMap与AtomicInteger的ConcurrentHashMap

时间:2020-04-30 19:48:46

标签: java multithreading java.util.concurrent

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

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

如果我正确理解:

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

通过将AtomicInteger作为哈希图的值,多个线程可以安全地修改图中已经存在的值。

因此:如果您的地图是静态的(构建后不会添加/删除任何内容),那么带有AtomicInteger的HashMap可以安全使用,并且开销很小。

如果在地图中添加/删除地图项,请使用ConcurrentHashMap。如果使用Integer,则必须将值设置为map才能对其进行修改。如果使用AtomicInteger,则只需设置整数值即可。

相关问题