CopyOnWriteArrayList原始碼分析

2021-09-11 08:20:53 字數 1713 閱讀 3351

copyonwritearraylist是乙個適用於都多寫少的執行緒安全集合類,但是也需要明白的是讀寫分離的集合都會存在弱一致性。說人話就是會有髒讀的情況出現呀。

不過總體來說是乙個不錯的工具類,今天孤盡老師說到有人用這個類來當寫多讀少的用。

我其實想了一下為什麼這哥們會這麼玩。應該是有兩種情況

1.真不明白原理

2.因為不會用的別方式實現執行緒安全的集合,然後該集合又正好實現了執行緒安全的寫。所以就用了。。。。當萬精油用咯

先看下類圖

很簡單的常規操作,資料結構是陣列。內部實現乙個迭代器,然後搞乙個cowsublist用來獲取集合某一部分資料,在arraylist裡面sublist有的坑這裡照樣有。

我猜想sublist方法為什麼不拷貝乙份快照,而是直接用原來的集合然後做乙個比較是否改變。

看了一下arraylist的注釋有下面這段話

所以我猜想了一下原因

1.本身該方法設計就是用來讀取乙個檢視,檢視參見資料庫的檢視。什麼意思了?就不打算讓你改唄

2.複製其實資料量大一點挺消耗記憶體的,節省資源提高效能?

咱們還是接著看**,主要看讀寫分離的實現思路

private

transient

volatile object[

] array;

//通過volatile保證可見性,但是其實也影響一點效能。因為每次都需要寫回主記憶體之後,再從主記憶體強制載入到工作記憶體。

final object[

]getarray()

public e set

(int index, e element)

else

return oldvalue;

//返回舊值

}finally

}public e get

(int index)

好了上面的讀寫分離的實現就寫完了,至於為啥適合多讀少寫。其實也很明白了

尼瑪如果多寫少讀自己不會加乙個鎖實現?非要用這個?每次都拷貝乙份資料,良心不會痛?

然後咱們再說說sublist的坑,繼續看下源**

public list

sublist

(int fromindex,

int toindex)

finally

}// only call this holding l's lock將this給傳進來了然後設定一下expectedarray

cowsublist

(copyonwritearraylist

list,

int fromindex,

int toindex)

//以後檢視的任何操作都會呼叫這個方法判斷一下,所以拿了檢視之後不要隨意修改原先list的資料不然會**。

private

void

checkforcomodification()

好了這個類的原始碼就寫完了,其實jdk集合的**真的簡單。沒有什麼特別**的操作,除了1.8的concurrenthashmap的部分原始碼看的有點難受~

歡迎掃碼加入知識星球繼續討論

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...

Android AsyncTask原始碼分析

android中只能在主線程中進行ui操作,如果是其它子執行緒,需要借助非同步訊息處理機制handler。除此之外,還有個非常方便的asynctask類,這個類內部封裝了handler和執行緒池。本文先簡要介紹asynctask的用法,然後分析具體實現。asynctask是乙個抽象類,我們需要建立子...