文章目录
前言
我们都知道ArrayList是线程不安全的,那么它不安全在哪里?又会出现什么并发问题呢?
ArrayList继承树
提示:以下是本篇文章正文内容。
一、ArrayList源码摘录
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
/**
* 列表元素集合数组
* 说明ArrayList基于数组存储数据
*/
transient Object[] elementData;
/**
* 列表大小,elementData中存储的元素个数
*/
private int size;
}
add() 方法
/**
* Appends the specified element to the end of this list.
* 将指定的元素追加到列表的末尾。
* add() 方法做了如下操作:
* 1.检查容量是否足够,如不够将进行扩容,并自增 modCount
* 2.将指定的元素追加到列表的末尾
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
//确保容量足够,如果不够进行扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
//将e存在index为size的位置(即最后一位的下一位置),size++
//我们都知道,++操作不是原子指令,多线程情况下将发生并发问题
elementData[size++] = e;
return true;
}
二、测试用例
@Test
public void listThreadUnsafe() throws InterruptedException {
<