我在 Java 中的并发和映射方面遇到了一些麻烦。基本上我有多个线程使用(读取和修改)他们自己的地图,但是这些地图中的每一个都是一个更大的地图的一部分,正在被另一个线程读取和修改:
我的主要方法创建所有线程,线程创建它们各自的映射,然后将其放入“主”映射:
Map<String, MyObject> mainMap = new HashMap<String, Integer>();
FirstThread t1 = new FirstThread();
mainMap.putAll(t1.getMap());
t1.start();
SecondThread t2 = new SecondThread();
mainMap.putAll(t2.getMap());
t2.start();
ThirdThread t3 = new ThirdThread(mainMap);
t3.start();
我现在面临的问题是第三个(主)线程在映射中看到任意值,这取决于一个或两个其他线程何时更新“他们的”项目。然而,我必须保证第三个线程可以迭代 - 并使用 - 映射的值,而不必担心正在读取的部分内容是“旧的”:
FirstThread(类似于 SecondThread):
for (MyObject o : map.values()) {
o.setNewValue(getNewValue());
}
第三线程:
for (MyObject o : map.values()) {
doSomethingWith(o.getNewValue());
}
有任何想法吗?我考虑过使用全局可访问(通过静态类的静态最终对象)锁,当必须修改映射时,它将在每个线程中同步。或者是否有特定的 Map 实现可以评估我可以使用的这个特定问题?
提前致谢!
编辑: 正如@Pyranja 所建议的,可以同步 getNewValue() 方法。但是我忘了提到我实际上是在尝试按照事务的方式做一些事情,其中 t1 和 t2 在 t3 使用所述值之前/之后修改多个值。t3 的实现方式是 doSomethingWith() 如果它没有改变,它实际上不会对值做任何事情。