【发布时间】:2013-10-03 16:48:58
【问题描述】:
之前已经发布过类似的问题,但这种情况有所不同 - 静态使用可能会使问题复杂化。 只是想看看是否有人对如何处理这个问题有想法。 即使我在修改它的两个块周围的列表上使用同步,我也会得到 ConcurrentModificationException。
public class Foo {
public void register() {
FooManager.addFoo(this);
}
}
public class ABC1 {
static Foo myfoo;
static {
myfoo = new Foo();
myfoo.register();
}
}
(我有多个类似的类 ABC2、ABC3)
public class FooManager {
static ArrayList<Foo> m_globalFoos;
static ABC1 m_abc;
static {
m_globalFoos = new ArrayList<Foo>();
m_abc = new ABC1();
}
public static void addFoo(Foo foo) {
synchronized(m_globalFoos) { // SYNC
m_globalFoos.add(foo);
}
}
public static void showFoos() {
synchronized(m_globalFoos) { //SYNC
for (Foo foo : m_globalFoos) {
foo.print();
}
}
}
我声明 ABC1、ABC2、ABC3 等超过 1 个线程功能。 在我的主程序中,第一行
main() {
FooManager.showFoos();
异常详情:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.mytest.FooManager.showFoos(FooManager.java:78)
at com.mytest.FooTest.main(FooTest.java:109)
【问题讨论】:
-
这里只有1个线程吗?您无法仅使用单个线程获得并发修改。要了解这实际上是如何发生的,我需要了解您何时以及如何制作线程。
-
当然可以,尝试循环遍历 Set 并从循环中删除项目(不使用正确的 iterator.remove 方法)
-
@JasonNichols 很公平,但至少在这种情况下不是
-
@Cruncher - 实际上,您可以通过一个线程获得 ConcurrentModificationException。事实上,这是最有可能发生的情况(也是最常见的错误)。
-
显示完整的异常堆栈跟踪。
标签: java synchronized