我有一个 Java 1.8 类,它包含两个集合:
Map<Key,Object>
Set<Object>
我的类(class)五个方法:
addObjectToMap()
removeObjectFromMap()
addObjectToSet()
removeObjectFromSet()
loopOverEverything(){
for(Object o : mySet){
for(Object o2 : myMap.getKeySet()){
doSomething(o,o2);
}
}
}
该类的重点是实现观察者模式,但在观察者和被观察者中都非常灵活。我面临的问题是,当线程在循环进行时调用添加/删除方法时,最后一个方法很容易抛出 ConcurrentModificationException。我正在考虑同步“this”上的所有方法:
set.add(object);
会变成
synchronized(this){
set.add(object);
}
我会向其他 4 个方法添加类似的同步语句,包括循环方法。
这行得通吗?我知道同步方法可能会导致瓶颈。尽管目前不存在性能问题,但我希望合理化此设计,并了解对性能影响较小的可能替代方案。
最佳答案
不,除非循环也同步,否则它是不安全的。如果您想避免每个循环期间的锁定开销,请考虑使用并发集合,例如 ConcurrentHashMap
和Collections.newSetFromMap(new ConcurrentHashMap<>())
.
关于java - 同步方法以防止 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479909/