我有一个Java 1.8类,它拥有两个集合:同步方法,以防止ConcurrentModificationException的
Map<Key,Object>
Set<Object>
我班的五种方法:
addObjectToMap()
removeObjectFromMap()
addObjectToSet()
removeObjectFromSet()
loopOverEverything(){
for(Object o : mySet){
for(Object o2 : myMap.getKeySet()){
doSomething(o,o2);
}
}
}
类的一点是要实现观察者模式,但在观察者和观察者中都非常灵活。我面对的问题是当循环正在进行时线程调用add/remove方法时,最后一个方法可以轻松地抛出ConcurrentModificationException异常。我在想同步的“这样”的所有方法:
set.add(object);
将成为
synchronized(this){
set.add(object);
}
,我会增加一个类似声明同步到其他4种方法,包括环法。
这项工作?我知道同步方法可能会导致瓶颈。尽管目前没有性能问题,但我希望将此设计合理化并听取可能的性能下降较少的替代方案。
@AndyTurner这可能不会解决问题 - Collections.synchronizedSet'在迭代期间没有锁定,所以仍然可以很容易地获得'ConcurrentModificationException'。 – Sbodd