ava.util.ConcurrentModificationException 异常

来源:互联网 发布:标准曲线计算软件 编辑:程序博客网 时间:2024/05/20 14:20
<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);    }

List.sort()
    @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线程不安全)
0 0
原创粉丝点击