CopyOnWriteArrayList

参考:

cyc2018

CopyOnWriteArrayList理解与理解

浅析CopyOnWriteArrayList

如果想要得到一个线程安全的ArrayList:

  • vector(开销比ArrayList大,扩容是2倍,访问速度慢)
  • Collections.synchronizedList()得到一个线程安全的ArrayList
  • JUC包下的CopyOnWriteArrayList类

总结

  • CopyOnWriteArrayList适用于多线程场景下使用,其采用读写分离的思想,读操作不上锁,写操作用ReentrantLock上锁。
  • 写操作在一个复制的数组上进行,操作完把原数组指向新的复制数组。
  • 读操作在原始数组上进行,互不影响。
  • 缺点:
    • 内存占用:在写操作时需要复制数组
    • 实时性差:读操作不能读取实时性的数据,因为是读写分离的,写操作的数据还没同步到读数组上。
  • CopyOnWriteArrayList不适合内存敏感以及对实时性要求很高的场景。

代码

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

final void setArray(Object[] a) {
    array = a;
}
posted @ 2021-02-25 12:40  Jayzou11223  阅读(47)  评论(0编辑  收藏  举报