理解
CopyOnWrite就是寫時複製容器。在寫入數據的時候,會從源容器複製出一個新容器,然後在新容器中添加元素,添加完成之後,再讓源容器指針指向新容器。
寫時複製容器的好處
可以對CopyOnWrite併發讀取,而不需要加鎖,因爲當前容器不會添加任何元素。
這是一種讀寫分離的思想,讀和寫分別使用不同的容器
寫時複製容器的缺點
1、每次修改都會新建一個數組,如果源數組很大,修改操作比較頻繁,性能就會很低,內存會有大開銷
2、數據一致性問題:因爲修改並不會馬上就能夠被讀到,即只能保證最終一致性,不能保證實時一致性。
適用場景:
多讀少寫的場景,比如白名單、黑名單、商品類目的訪問,因爲大多數是讀,偶爾修改;
舉例:
假如我們有一個商品的搜索網站,搜索的時候有些關鍵詞是需要被屏蔽掉的,這個時候就可以使用CopyOnWrite存放不能搜索的黑名單,如果用戶搜索的關鍵詞在黑名單中,就提示不能搜索
使用寫時複製容器需要注意的事情:
1、儘量在初始化的時候指定容器大小,避免容器擴容產生的開銷
2、寫入數據的時候,最好一次性寫入,防止多次複製
demo:把數據放在List中,一次性寫入寫時複製容器
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(list);
}
}
常用方法
寫時複製容器常用方法和普通集合差不多