我通常提供有效的代码,但是在这种情况下是不可能的。同样,这是非常零星的,甚至提供缩小比例也不会产生错误。
在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与循环迭代器无关。 即使这是一个代码段,循环也是完整的代码。 此代码段中是否有某些内容被忽略?
答案 0 :(得分:0)
synchronized
方法仅锁定该方法调用的对象,例如对于迭代器,这不是迭代器的生命周期。如果要在同步集合上使用Iterator,则需要对其锁定。
synchronized(myToolBar) {
for (Component c : this.myToolBar.values()) {
if (c instanceof JSeparator)
myMainToolbar.addSeparator();
else
myMainToolbar.add(c);
}
}
注意:我认为在此循环中没有任何修改myToolBar的操作,否则它将无法正常工作。