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();}}
优缺点
优点
使用场景
- 读多写少的场景,比如白名单,黑名单等
- 集合不大的
- 实时性要求不高的
