CopyOnWriteArrayList源碼分析

在實際的編程的時候我們肯定會遇到併發編程的時候,那我們就要考慮併發編程的時候,可能出現的問題。所以我們就要用到Java的併發包的類,去完成我們的工作。

今天我們就來分析CopyOnWriteArrayList這個併發容器,他是怎麼做到的併發編程的。

我們不跟原來一樣,直接貼代碼,然後給大家一行一行的講代碼的意思。

我們分析思路
1。爲什麼他能做到,多個線程訪問的時候,數據不會出錯。
2。他是怎麼做的,是加鎖了?還是???
3。用的什麼思想。
我們接下來就從這些問題入手

首先我們先了解這個東西是什麼。
CopyOnWrite容器即寫時複製的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裏添加元素,添加完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因爲當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

接下來我們帶着問題去分析源碼。
1。首先我們還是看看他的類的結構。
這裏寫圖片描述
2。我們從上面的問題出發。爲什麼能做到讀寫分離,是加鎖?我們直接看add()方法。
這裏寫圖片描述
看到這裏大家可能就有點明白怎麼回事了,圈出來的地方,申明瞭一個可重入鎖,加鎖方法保證寫入數據。防止多個線程寫的時候,copy出來很多個副本。然後裏面就是一個簡答的數組的複製,添加元素買最後釋放鎖,大家注意的是,我們需要把釋放鎖寫在finally裏面,保證一定能釋放,這個鎖是需要我們自己手動釋放的,自己不會釋放。

3。我們都知道,這個容器是讀寫分離,我們考慮看看,讀的時候需不需要加鎖,保證讀的一致。
這裏寫圖片描述
我們可以看到在讀的時候是沒有加鎖的,那是因爲我們在寫的時候,沒有鎖住舊的副本,只是複製了一個新的而已,舊的沒有變化。所以我們在讀的時候讀到的數據不是我們實時寫進去的數據。讀到的是舊的數據

4。看到這裏我們分析的就已經擦不多了,但是大家考慮到一個問題沒有,一個東西不可能是完美的,CopyOnWrite容器能保證數據的弱一致,那麼她有什麼缺點?

數據一致性問題。CopyOnWrite容器只能保證數據的最終一致性,不能保證數據的實時一致性。所以如果你希望寫入的的數據,馬上能讀到,請不要使用CopyOnWrite容器。,我們能有別的容器代替?答案肯定是有的,我們可以用ConcurrentHashMap來代替他,下篇博客我們分析ConcurrentHashMap。

我們在讀的操作比較多,寫的操作比較少的時候,我們可以使用這個容器。

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