我对Java中的并发数据结构有疑问,具体来说:
1) ConcurrentHashMap<String, Integer>
2) HashMap<String, AtomicInteger>
3) ConcurrentHashMap<String, AtomicInteger>
如果我正确理解:
1)读/写是线程安全的,只有一个线程可以对一对线程执行写操作(应允许对所有线程进行读取),因此,如果另一个线程应修改另一对线程(与之前不同),则必须等待获取锁。
2)每个线程都可以访问AtomicInteger值(一定要读取),但是两个线程可以同时修改不同的。
3)从逻辑的角度来看,我认为第一种情况是相同的
以上三种数据结构的主要区别是什么?
在多线程情况下,每个线程应同时递增/递减整数值,最佳选择是什么?
答案 0 :(得分:0)
在向地图添加/从地图中删除项目时,可以安全地从多个线程使用ConcurrentHashMap。 HashMap不是。可以读取多个线程,但只能写入一个线程,并且在写入过程中,不应再读取其他线程。
通过将AtomicInteger作为哈希图的值,多个线程可以安全地修改图中已经存在的值。
因此:如果您的地图是静态的(构建后不会添加/删除任何内容),那么带有AtomicInteger的HashMap可以安全使用,并且开销很小。
如果在地图中添加/删除地图项,请使用ConcurrentHashMap。如果使用Integer,则必须将值设置为map才能对其进行修改。如果使用AtomicInteger,则只需设置整数值即可。