ArrayList的线程安全并发类,写时复制。简单来说就是:多线程往集合中添加元素的时候,都会加锁,然后复制一份新的集合,写完数据后,把原来的内存指针指向新的内存,原来的内存就被回收掉啦。读线程读取数据的时候,如果此时有写线程在写数据,那读线程读到的是旧数据。

源码分析

添加元素

  1. public boolean add(E e) {
  2. //先上锁
  3. final ReentrantLock lock = this.lock;
  4. lock.lock();
  5. try {
  6. Object[] elements = getArray();
  7. int len = elements.length;
  8. //复制一个新的数组
  9. Object[] newElements = Arrays.copyOf(elements, len + 1);
  10. newElements[len] = e;
  11. //指向新的内存地址
  12. setArray(newElements);
  13. return true;
  14. } finally {
  15. lock.unlock();
  16. }
  17. }

优缺点

优点

  • 数据一致性完整。因为加了锁
  • 解决了集合多线程遍历迭代问题

    缺点

  • 耗内存,因为要进行复制

  • 实时性不高

使用场景

  1. 读多写少的场景,比如白名单,黑名单等
  2. 集合不大的
  3. 实时性要求不高的