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是乙個抽象類,我們需要建立子...