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;
}
信心最重要