ArrayList多线程调用add()可能出现的问题

    xiaoxiao2022-07-02  99

    ArrayList在多线程调用Add()添加元素时的下标越界问题 高并发下ArrayList空值(null)问题

    以下为上面文章的总结: 1:下标越界问题

    public boolean add(E e) { ensureCapacityInternal(size + 1); // 是否需要扩容 elementData[size++] = e;//赋值 return true; }

    多个线程进入ensureCapacityInternal()并执行完毕,此时都不需要扩容,依次赋值时会size+1,所以从第二个开始的线程赋值时其下标很可能超过了容量值,赋值时就报错了 2:存入的值变为null elementData[size++] = e是先赋值再size+1,多线程运行到赋值还没+1时,size位置上被覆盖了多次,然后多次+1,size+1,+2等位置没赋值过,下次就直接从size+n开始赋值,看起来就add了null值一样,此时不会报错,因为add时没有null所以取出时没做考虑就可能报NullPointerException了

    解决办法:Collections.synchronizedList(arrayList)获取线程安全的list,使用list.iterator()遍历时最好放在同步块里,原理:说说线程安全包装:Collections.synchronizedList

    最新回复(0)