ArrayList的线程安全并发类,写时复制。简单来说就是:多线程往集合中添加元素的时候,都会加锁,然后复制一份新的集合,写完数据后,把原来的内存指针指向新的内存,原来的内存就被回收掉啦。读线程读取数据的时候,如果此时有写线程在写数据,那读线程读到的是旧数据。
源码分析
添加元素
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();
}
}
优缺点
优点
使用场景
- 读多写少的场景,比如白名单,黑名单等
- 集合不大的
- 实时性要求不高的