java - 以原子方式更新两个 ConcurrentHashMap

标签 java multithreading concurrency

Map<String,Integer> m1 = new ConcurrentHashMap<>();
Map<String,Integer> m2 = new ConcurrentHashMap<>();
public void update(int i) {
  m1.put("key", i);
  m2.put("key", i);
}

在上面的虚拟代码中,对 m1 和 m2 的更新不是原子的。如果我尝试同步此 block ,findBugs 会提示“在 util.concurrent 实例上执行同步”

除了不使用并发集合并显式执行所有同步之外,是否有推荐的方法来执行此操作。

顺便说一句,我也不知道在显式同步中包装并发集合的确切含义。

最佳答案

如果意图是对于一个键,两个映射总是检索相同的值,那么使用两个不同的并发映射的设计是有缺陷的。即使同步写入,读取线程仍然可以在写入时访问这两个映射。这可能就是 FindBugs 规则试图捕获的内容。

有两种方法可以解决这个问题,要么使用显式同步(即两个具有同步读取和写入的常规映射),要么使用仅一个并发映射和放入一个值对象中,保存两个 int。

关于java - 以原子方式更新两个 ConcurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109127/

相关文章:

java - 检查屏幕名称中是否只有一个连字符/下划线

java - 如何在同一个局域网或wifi网络中找到打印机的IP地址?

java - 当我们有空列表时如何使用空列表

java - 通过不同线程同时读取和更改变量

java - 如何从 Eclipse 中运行的 ant 文件中查找 Eclipse 的路径?

c# - 锁定不起作用

multithreading - 如何将 PrimInt 传递给多个线程?

Java EE WebListener 和线程

algorithm - 用于并行编程的缓存不经意算法?

groovy - GPars默认池大小是多少?