并发容器之CopyOnWriteArrayList - omigaw/spring- GitHub Wiki

1. COW的设计思想

牺牲数据的实时性满足数据的最终一致性即可。CopyOnWriteArrayList就是通过Copy-On-Write(COW),即写时复制的思想来通过延迟更新的策略来实现数据的最终一致性,并且能够保证读线程间不阻塞。
COW通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。对CopyOnWrite容器进行并发的读的时候,不需要加锁,因为当前容器不会添加任何元素,所以CopyOnWrite容器也是一种读写分离的思想,延时更新的策略是通过在写的时候针对的是不同的数据容器来实现的,放弃数据实时性达到数据的最终一致性。

2. COW vs 读写锁

相同点: 
     1. 两者都是通过读写分离的思想实现;
     2. 读线程间是互不阻塞的;
不同点:
     对读线程而言,为了实现数据实时性,在写锁被获取后,读线程会等待或者当读锁被获取后,写线程会等待,从而解决"脏读"问题,也就是说如果使用读写锁依然会出现读线程阻塞等待的情况。而COW则完全放开了牺牲数据实时性而保证数据最终一致性,即读线程对数据的更新是延时感知的,因此读线程不会存在等待的情况。

3. COW的缺点

 1.内存占用问题
 2.数据一致性问题