CopyOnWriteArrayList 面試集錦

1.CopyOnWriteArrayList是線程安全List集合,我們看下add方法的實現:
在這裏插入圖片描述
先拷貝了【當前集合 存儲數據的數組】 一份副本,然後操作副本,add對象,最後將副本引用賦值給 【當前集合 存儲數據的數組】。在此過程中操作的都是副本,所以別的線程修改此集合不會導致線程安全問題。

CopyOnWriteArrayList 有幾個缺點:
1、由於寫操作的時候,需要拷貝數組,會消耗內存,如果原數組的內容比較多的情況下,可能導致young gc或者full gc

2、不能用於實時讀的場景,像拷貝數組、新增元素都需要時間,所以調用一個set操作後,讀取到數據可能還是舊的,雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實時性要求;

CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用
因爲誰也沒法保證CopyOnWriteArrayList 到底要放置多少數據,萬一數據稍微有點多,每次add/set都要重新複製數組,這個代價實在太高昂了。在高性能的互聯網應用中,這種操作分分鐘引起故障。

Vector線程所謂的安全
vector對單獨的add,remove等方法都是在方法上加了synchronized,但是下面代碼多線程執行就會出現線程安全問題,原因是線程A調用size時,另一個線程B 執行了remove,然後size的值就不是最新的,然後線程A調用remove就會越界。
在這裏插入圖片描述
解決辦法加上synchronized
在這裏插入圖片描述
這樣就導致有了雙重鎖,效率大大降低,何必呢。於是vector廢棄了,要用就用CopyOnWriteArrayList 吧。

老生常談:深圳有愛好音樂的會打鼓(吉他,鍵盤,貝斯等)的程序員和其它職業可以一起交流加入我們樂隊一起嗨。我的QQ:657455400 表演視頻實例https://v.qq.com/x/page/f0517awx0x4.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章