我对CopyOnWrite的思考

 

CopyOnWrite 后文中表述为 COW并发

CopyOnWrite容器即写的时候复制一个新的容器进行写:通俗的理解是当咱们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,而后在新的容器里添加元素,添加完元素以后,再将原容器的引用指向新的容器。dom

为何要这么作?

咱们须要了解到一个异常叫作:ConcurrentModificationException。一般对容器进行并发的读和写的时候会出现该异常,好比说foreach遍历List的时候往其中add元素。post

了解到ConcurrentModificationException异常后,咱们就能够结合COW进行思考,若是写操做的时候不复制一个容器,仍然是以前的容器,那么此时并发的读操做就是对以前容器进行的操做,一个容器在被读的时候,又被另一个线程进行了写操做,会报出上述错误。spa

因此CopyOnWrite容器也是一种读写分离的思想,读和写不一样的容器,不会发生ConcurrentModificationException异常线程

COW带来的好处!

能够对CopyOnWrite容器进行并发的读,而不须要加锁,由于当前容器不会添加任何元素。code

对比Concurrent容器

  • 最大的优点就是COW容器在被写的时候,仍然是能够读的。而Concurrent容器在写的时候,不能读。
  • 不足1:COW容器在写入的时候会进行内部容器的复制,因此内部实现上多了一份核心数据的拷贝赛所需的资源,能够理解为:拿空间换时间
  • 不足2:COW容器仅仅保证了数据的最终一致性,Concurrent容器保证了数据随时的一致性。

适用场景

  • 对数据在操做过程当中的一致性要求不高
  • 根据上述不足1进行分析能够得出:更适用于读大于写的场景。换言之COW容器中保存的数据应该是尽量不变化的。
相关文章
相关标签/搜索