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