Java ConcurrentModificationException尝试复制工作映射
我正在处理一个长时间运行的任务,该任务有一个线程,该线程应该检查并打印工作线程中对象的状态,我有以下内容 在工作线程Java ConcurrentModificationException尝试复制工作映射,java,multithreading,synchronization,concurrentmodification,Java,Multithreading,Synchronization,Concurrentmodification,我正在处理一个长时间运行的任务,该任务有一个线程,该线程应该检查并打印工作线程中对象的状态,我有以下内容 在工作线程HashMap中,一些东西正在被主动读/写,在我的状态线程中,我有 Map<A, B> someStuffCopy; synchronized ( someStuff ) { someStuffCopy = new HashMap<A, B>( someStuff ); } 地图复制; 同步(某些东西) { someStuffCopy=新HashM
HashMap中,一些东西正在被主动读/写,在我的状态线程中,我有
Map<A, B> someStuffCopy;
synchronized ( someStuff )
{
someStuffCopy = new HashMap<A, B>( someStuff );
}
地图复制;
同步(某些东西)
{
someStuffCopy=新HashMap(someStuff);
}
在我总是在synchronized块中的行上遇到ConcurrentModificationException
之前,这可以工作几个周期
我的方法可能完全错误,但我希望能够复制工作集,应用一些中间转换,然后打印统计数据
如何修复该异常?您没有显示足够的代码来诊断该问题,但使用threadsafe映射实现可能会修复该问题:
someStuff = new ConcurrentHashMap<>();
Map<A, B> someStuffCopy;
synchronized ( someStuff ) {
someStuffCopy = new ConcurrentHashMap<A, B>( someStuff );
}
someStuff=new ConcurrentHashMap();
地图复印件;
同步(某些东西){
someStuffCopy=新的ConcurrentHashMap(someStuff);
}
取决于您在其他地方所做的工作,可能只对参数something
使用ConcurrentHashMap
就足够了。Matt,什么类型的A
和B
?另外,您是否在其他地方迭代某些东西?另外,someStuff
在初始填充后是否需要更改?A和B不重要,如前所述,someStuff正在被主动读/写,没有其他迭代。ConcurrenthashMap解决了这个问题。synchronized
只有在所有访问资源的代码都将使用它时才有帮助。它不防止任意访问,它只排除同一对象上的代码同步。在中进行1m以上的迭代,没有异常,看起来这样就可以了。谢谢你,好心的先生。干杯。也请尝试删除同步块。someStuffCopy
也不需要是ConcurrentHashMap
实例,因为它只从中读取,从不修改。