原理

  1. 默认容量 private static final int DEFAULT_CAPACITY = 10;
  2. 构造函数
    1. 空,构造空数组
    2. initialCapacity,构造大小为initialCapacity的数组
  3. 扩容
    1. 当数组为空数组时,直接扩容,大小为10,
    2. 不为空,判断是否满,满了则扩容,为原数组的1.5倍
    3. 使用Arrays.copyOf 进行扩容

fail-fast

新建了一个ArrayList,名称为arrayList。
向arrayList中添加内容
新建一个“线程a”,并在“线程a”中通过Iterator反复的读取arrayList的值。
新建一个“线程b”,在“线程b”中删除arrayList中的一个“节点A”。
这时,就会产生有趣的事件了。
在某一时刻,“线程a”创建了arrayList的Iterator。此时“节点A”仍然存在于arrayList中,创建arrayList时,expectedModCount = modCount(假设它们此时的值为N)。
在“线程a”在遍历arrayList过程中的某一时刻,“线程b”执行了,并且“线程b”删除了arrayList中的“节点A”。“线程b”执行remove()进行删除操作时,在remove()中执行了“modCount++”,此时modCount变成了N+1!
“线程a”接着遍历,当它执行到next()函数时,调用checkForComodification()比较“expectedModCount”和“modCount”的大小;而“expectedModCount=N”,“modCount=N+1”,这样,便抛出ConcurrentModificationException异常,产生fail-fast事件。

CopyOnWriteArrayList

  1. 重入锁
  2. 拷贝到新数组,然后赋值回去
    1. public boolean add(E e) {
    2. final ReentrantLock lock = this.lock;
    3. lock.lock();
    4. try {
    5. Object[] elements = getArray();
    6. int len = elements.length;
    7. Object[] newElements = Arrays.copyOf(elements, len + 1);
    8. newElements[len] = e;
    9. setArray(newElements);
    10. return true;
    11. } finally {
    12. lock.unlock();
    13. }
    14. }