赞
踩
ArrayList、vector和linkedlist的区别
ArrayList非线程安全的原因:
public boolean add(E e) { ensureCapacity(size + 1); elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); } }
从源码中 elementData[size++] = e; 这个方法,首先这个方法不是一个原子操作,所以不能保证多线程环境安全,这个可以拆分为两步:
a、 elementData[size] = e; b、 size++;
在Thread1执行elementData[size]=e时,cpu暂停对Thread1的执行,来执行Thread2,此时size还没加一,Thread2执行a、b两步的时候就会覆盖Thread1对elementData[size]的赋值,然后Thread1、Thread2都执行size++操作。
既然ArrayList是线程不安全的,但如果需要在多线程中使用,可以采用list list =Collections.synchronizedList(new ArrayList)来创建一个ArrayList对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。