java.util.ConcurrentModificationException - 抛出此异常的简单循环

标签 java concurrency

我通常会提供工作代码,但在这种情况下这是不可能的。此外,这是非常零星的,即使提供按比例缩小也可能不会产生错误。

从 ConcurrentModificationException 线程中,通常问题在 Collection 和关联的操作/循环中可见。我希望在这种情况下一个小代码片段足以指出我可能遗漏的东西。

//This is the definition of one object being used. 
protected Map<Integer,Component> myToolBar = Collections.synchronizedMap(new TreeMap<Integer,Component>());
    :
    :
myMainToolbar = createToolBar(); ///The procedure returns a new JToolBar object
    :
    :            
Set<Integer> keys = this.myToolBar.keySet();
Iterator<Integer> iter = keys.iterator();
if (iter.hasNext())
{
    while (iter.hasNext())
    {
        Component c = this.myToolBar.get(iter.next());//<----This produces the error. 

        if (c instanceof JSeparator)
        {
            myMainToolbar.addSeparator();
        }
        else
        {
            myMainToolbar.add(c);
        }
    }
}

这是返回错误:

  Exception in thread "Thread-546" 
  java.util.ConcurrentModificationException
        at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source)
        at java.util.TreeMap$KeyIterator.next(Unknown Source)

迭代器未被操作。 正在修改的 newMainToolbar 与循环迭代器无关。 尽管这是一个代码片段,但循环是完整的代码。 此代码片段中是否忽略了某些内容?

最佳答案

synchronized 方法仅锁定该方法调用的对象,例如对于Iterator来说,它不是为了Iterator的生命周期。如果你想在同步集合上使用迭代器,你需要持有它的锁。

synchronized(myToolBar) {
    for (Component c : this.myToolBar.values()) {
        if (c instanceof JSeparator)
            myMainToolbar.addSeparator();
        else
            myMainToolbar.add(c);
    }
}

注意:我假设此循环中没有任何内容修改 myToolBar,否则它将无法工作。

关于java.util.ConcurrentModificationException - 抛出此异常的简单循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708066/

相关文章:

scala - Spark UDF 线程安全

java - volatile 关键字对于 Java 中的非原始值来说是无关的吗?

sql-server - 在更新语句中递增时是否存在并发问题

java - ANTLR 基本行为

java - 'pure' MVC 实现有多有用?

java - 在java中将KML文件转换为SHP文件

java - keystore 类型 : which one to use?

java - 为什么我无法在 Windows 上运行 APK 文件?

python - 同时 Celery 任务共享一个公共(public)对象(数据库连接)

java - 如果线程没有被阻塞,Thread.interrupt() 会做什么?