我在Java中遇到了并发和映射的一些问题。基本上,我有多个线程使用(读取和修改)自己的映射,但是每个这些映射都是一个更大的映射的一部分,而该更大的映射正在被另一个线程读取和修改。
我的主方法创建所有线程,线程创建它们各自的映射,然后将其放入“主”映射中:
有什么想法吗?我考虑使用全局可访问的(通过静态类的static final Object)锁,在每个线程中同步修改地图时会用到。或者是否有特定的Map实现可以解决这个问题,我可以使用?
提前致谢!
编辑:如@Pyranja所建议的那样,同步getNewValue()方法是可能的。然而,我忘了提到我实际上正在尝试做一些类似于事务的事情,其中t1和t2在t3处理这些值之前/之后修改多个值。 t3的实现方式使得如果值没有改变,则doSomethingWith()实际上不会对该值进行任何操作。
我的主方法创建所有线程,线程创建它们各自的映射,然后将其放入“主”映射中:
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();
我现在面临的问题是第三个(主)线程在地图中看到任意值,取决于另外两个线程何时更新它们自己的项目。然而,我必须保证第三个线程能够遍历和使用地图中的值,而不必担心所读取的部分是“旧”的:
第一个线程(类比于第二个线程):
for (MyObject o : map.values()) {
o.setNewValue(getNewValue());
}
第三线程:
for (MyObject o : map.values()) {
doSomethingWith(o.getNewValue());
}
有什么想法吗?我考虑使用全局可访问的(通过静态类的static final Object)锁,在每个线程中同步修改地图时会用到。或者是否有特定的Map实现可以解决这个问题,我可以使用?
提前致谢!
编辑:如@Pyranja所建议的那样,同步getNewValue()方法是可能的。然而,我忘了提到我实际上正在尝试做一些类似于事务的事情,其中t1和t2在t3处理这些值之前/之后修改多个值。 t3的实现方式使得如果值没有改变,则doSomethingWith()实际上不会对该值进行任何操作。