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