<span style="line-height: 1.875; white-space: pre-wrap; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">问题场景</span>
jdk1.7:
多线程下使用Collection.sort() OK
切换到jdk1.8 的时候,出现 java.util.ConcurrentModificationException异常
解决办法:查看jdk1.7Collection的源码:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
jdk1.8版本:
Collections.sort()
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
我使用的list类型为ArrayList,查看ArrayList的sort源码:
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
抛出异常的情况就是并发情况下,第一个集合sort之后,modcount++ 值发生变化了,第二个线程进来对比就抛异常(sort线程不安全)