java.util.ConcurrentModificationException-引发此异常的简单循环

时间:2018-08-06 12:49:21

标签: 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)

没有操纵Iterator。 正在修改的newMainToolbar与循环迭代器无关。 即使这是一个代码段,循环也是完整的代码。 此代码段中是否有某些内容被忽略?

1 个答案:

答案 0 :(得分:0)

synchronized方法仅锁定该方法调用的对象,例如对于迭代器,这不是迭代器的生命周期。如果要在同步集合上使用Iterator,则需要对其锁定。

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

注意:我认为在此循环中没有任何修改myToolBar的操作,否则它将无法正常工作。