【发布时间】:2014-09-26 15:35:42
【问题描述】:
我有 Android 多线程应用程序。
两个或多个触发器可能运行相同的代码部分。
我有一个对象列表。
我让它被Collections.synchronizedList同步
private List<WmGroupItemSample> mGroupItemSampleList;
mGroupItemSampleList = new ArrayList<WmGroupItemSample>();
mGroupItemSampleList = Collections.synchronizedList(mGroupItemSampleList);
但是有时我在网上遇到异常:
Collections.sort(mGroupItemSampleList, new GroupItemSampleComparator());
java.util.ConcurrentModificationException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:62)
at java.util.Collections.sort(Collections.java:1895)
- 此流程合法吗?
- 我需要创建副本并在副本上运行排序吗?
- 为什么
Collections.synchronizedList不能阻止这个异常?
[编辑]
GroupItemSampleComparator
public class GroupItemSampleComparator implements java.util.Comparator<WmGroupItemSample> {
public GroupItemSampleComparator() {
super();
}
public int compare(WmGroupItemSample s1, WmGroupItemSample s2) {
return ( (s2.getStartDate() - s1.getStartDate()) > 0 ) ? (-1) : (1);
}
}
谢谢,
【问题讨论】:
-
这个异常可以在没有任何[附加]线程的情况下重现 - 因此,同步没有任何意义。
-
您使用的是哪个 Java 版本?我查看了一些 Collections.java,但第 1895 行并不靠近 sort。
-
伙计们,你们为什么要关注比较器?
-
@pavel:我记得读过原始问题,好像这是在没有多个线程的情况下发生的。这就是为什么每个人都要求比较器的原因。阅读编辑后的版本似乎这只是“正常”的并发修改。
标签: java concurrentmodification