CopyOnWriteArrayList原始碼分析

2021-08-01 00:01:36 字數 1855 閱讀 8874

原始碼基於1.8.0_112

copyonwritearraylist也是通過陣列來儲存元素,閱讀過之前的arraylist的話這邊應該很容易理解

原理:copyonwritearraylist內部通過陣列來儲存資料,每次修改list都會產生乙個新的陣列,然後複製原始資料。修改方法都通過內部的而乙個鎖物件來實現同步。如果乙個執行緒修改操作進行了一半,另外乙個執行緒來讀取集合,則它讀取的是修改前的陣列,不會產生同步異常。copyonwritearraylist進行迭代遍歷的時候,會儲存乙份快照,然後對這份快照進行遍歷,這種機制稱為安全失敗(fail-safe)。

大致瀏覽,結合具體方法來了解具體含義

// 鎖物件

final

transient reentrantlock lock = new reentrantlock();

// 儲存資料的陣列,只提供給get和set方法訪問

private

transient

volatile object array;

先閱讀預設建構函式,其他建構函式可在閱讀完具體操作後再回來閱讀

/**

* 建立乙個空的集合

*/public

mycopyonwritearraylist()

// 設定陣列

final

void setarray(object a)

每次加入資料都會新建乙個陣列,效能較差

加入資料時會新建乙個原本陣列長度+1的陣列,然後複製到新陣列中,最後在末尾賦值

/**

* 新增物件

*/public

boolean

add(e e) finally

}// 設定陣列

final

void setarray(object a)

// 獲取陣列

final object getarray()

很簡單的方法,不解釋

/**

* 隨機訪問

*/public e get(int index)

@suppresswarnings("unchecked")

private e get(object a, int index)

把不需要刪除的資料複製到乙個新的陣列中

* 刪除元素

*/public e remove(int index)

// 返回移除的值

return oldvalue;

} finally

}簡單分析iterator

迭代訪問的是原始資料的乙份快照

// 對快照進行遍歷

public cowiteratoriterator()

static

final class cowiterator

public

boolean

hasnext()

@suppresswarnings("unchecked")

public e next()

}

copyonwritearraylist為執行緒安全的集合類

隨機訪問不需要同步,所以訪問速度很快

修改操作會拷貝陣列,效能很差

適合頻繁訪問,極少修改的情況下使用

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