java - 同步方法以防止 ConcurrentModificationException

标签 java synchronization concurrentmodification

我有一个 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 个方法添加类似的同步语句,包括循环方法。

这行得通吗?我知道同步方法可能会导致瓶颈。尽管目前不存在性能问题,但我希望合理化此设计,并了解对性能影响较小的可能替代方案。

最佳答案

不,除非循环也同步,否则它是不安全的。如果您想避免每个循环期间的锁定开销,请考虑使用并发集合,例如 ConcurrentHashMapCollections.newSetFromMap(new ConcurrentHashMap<>()) .

关于java - 同步方法以防止 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479909/

相关文章:

java - 当我用鼠标拖动绘制圆形时,形状在某些情况下会移动

java - URI.create() 与新 URI()

.net - Microsoft Sync Framework 查询性能

java - 为什么在迭代期间从映射中删除不存在的元素有时只会崩溃?

java - 我该如何修复此错误 java.util.ConcurrentModificationException

java - Java中的Iterator如何知道何时抛出ConcurrentModification异常

java - gradlewAssembleRelease、gradlewInstallRelease 和 gradlew bundleRelease 之间有什么区别以及何时使用哪个?

java - 如何使用arraylist JAVA从矩阵中获取值

java - Apache Camel 同步文件路由

sql-server - 保持两个数据库模式同步的最佳方法是什么?