我對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容器中保存的數據應該是儘量不變化的。
相關文章
相關標籤/搜索