【发布时间】:2016-02-23 10:15:05
【问题描述】:
我的课堂上有以下代码:
private static LinkedList<MyObject> myList =
new LinkedList<MyObject>();
public static void doEventStuff(String user, String event){
LinkedList<MyObject> copy;
synchronized (myList) {
copy = new LinkedList<>(myList);
}
for (MyObject o : copy) {
... do something with objects o
}
}
public static void removeObject(MyObject o) {
synchronized (myList) {
myList.remove(o);
}
o.doCleanup();
}
public static void terminate() {
synchronized (myList) {
for (MyObject o : myList) {
o.doCleanup();
}
myList.clear();
}
}
public static List<MyObject> getMyObjectsCopy() {
synchronized (myList) {
return new LinkedList<>(myList);
}
}
我的问题是调用 terminate() 时出现 ConcurrentModificationException,特别是在迭代“for (MyObject o : myList)”时。
列表 myList 没有传递,只能通过静态方法访问。 另外:方法 MyObject.doCleanup() ca 触发事件,当在 terminate() mthod 中进行迭代时,可以调用方法“removeObject(MyObject)”,但由于所有方法同步 在“myList”上,我不相信会发生并发异常。
谁能帮我解决这个问题?
【问题讨论】:
-
如果可以从列表中删除对象,请使用迭代器而不是 for 循环。在这样的 for 循环期间删除对象可能会导致该异常。
-
对
myList进行了一些修改,您没有向我们展示。
标签: java concurrency