CopyOnWrite机制

ArrayList 并发读写存在安全问题,引入copyOnWrite机制。
核心思想:读写分离,空间换时间,避免为保证并发安全导致的激烈的锁竞争。
划关键点:
1、CopyOnWrite适用于读多写少的情况,最大程度的提高读的效率;
2、CopyOnWrite是最终一致性,在写的过程中,原有的读的数据是不会发生更新的,只有新的读才能读到最新数据;
3、如何使其他线程能够及时读到新的数据,需要使用volatile变量;
4、写的时候不能并发写,需要对写操作进行加锁;
CopyOnWrite机制 - 图1

源码原理

写时复制

  1. /*
  2. * 添加元素api
  3. */
  4. public boolean add(E e) {
  5. final ReentrantLock lock = this.lock;
  6. lock.lock();
  7. try {
  8. Object[] elements = getArray();
  9. int len = elements.length;
  10. Object[] newElements = Arrays.copyOf(elements, len + 1); //复制一个array副本
  11. newElements[len] = e; //往副本里写入
  12. setArray(newElements); //副本替换原本,成为新的原本
  13. return true;
  14. } finally {
  15. lock.unlock();
  16. }
  17. }
  18. //读api
  19. public E get(int index) {
  20. return get(getArray(), index); //无锁
  21. }