首页 > 其他 > 详细

CopyOnWriteArrayList

时间:2021-02-25 15:14:53      阅读:27      评论:0      收藏:0      [点我收藏+]

参考:

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;
}

CopyOnWriteArrayList

原文:https://www.cnblogs.com/jayzou/p/14446305.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!