什么是CopyOnWrite容器
- CopyOnWrite容器即寫時復制的容器。
- 通俗的理解是當我們往一個容器添加元素的時候冷溃,不直接往當前容器添加钱磅,而是先將當前容器進行Copy,復制出一個新的容器似枕,然后新的容器里添加元素盖淡,添加完元素之后,再將原容器的引用指向新的容器凿歼。
- 這樣做的好處是我們可以對CopyOnWrite容器進行并發(fā)的讀褪迟,而不需要加鎖,因為當前容器不會添加任何元素答憔。所以CopyOnWrite容器也是一種讀寫分離的思想味赃,讀和寫不同的容器。
CopyOnWrite的應用場景
CopyOnWrite并發(fā)容器用于讀多寫少的并發(fā)場景虐拓。
CopyOnWrite的缺點
-
內(nèi)存占用問題:因為CopyOnWrite的寫時復制機制心俗,所以在進行寫操作的時候,內(nèi)存里會同時駐扎兩個對象的內(nèi)存蓉驹,舊的對象和新寫入的對象(注意:在復制的時候只是復制容器里的引用城榛,只是在寫的時候會創(chuàng)建新對象添加到新容器里,而舊容器的對象還在使用态兴,所以有兩份對象內(nèi)存)狠持。如果這些對象占用的內(nèi)存比較大,比如說200M左右瞻润,那么再寫入100M數(shù)據(jù)進去喘垂,內(nèi)存就會占用300M献汗,那么這個時候很有可能造成頻繁的Yong GC和Full GC。之前我們系統(tǒng)中使用了一個服務由于每晚使用CopyOnWrite機制更新大對象王污,造成了每晚15秒的Full GC,應用響應時間也隨之變長楚午。
針對內(nèi)存占用問題昭齐,可以通過壓縮容器中的元素的方法來減少大對象的內(nèi)存消耗,比如矾柜,如果元素全是10進制的數(shù)字阱驾,可以考慮把它壓縮成36進制或64進制」置铮或者不使用CopyOnWrite容器里覆,而使用其他的并發(fā)容器 - 數(shù)據(jù)一致性問題:CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實時一致性缆瓣。所以如果你希望寫入的的數(shù)據(jù)喧枷,馬上能讀到,請不要使用CopyOnWrite容器弓坞。