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/