ConncurrentHashMap原始碼分析

2021-10-14 23:09:53 字數 694 閱讀 4271

#conncurrenthashmap原始碼分析

concurrenthashmap所使用的鎖分段技術,首先將資料分成一段一段的儲存, 然後給每一-段資料配一把鎖,當乙個執行緒占用鎖訪問其中乙個段資料的時候,其他段的資料也能被其他執行緒訪問。有些方法需要跨段,比如size()和containsvalue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖。這裡「按順序」是很重要的,否則極有可能出現死鎖,在concurrenthashmap內部,段陣列是final的,並且其成員變數實際上也是final的,但是,僅僅是將陣列宣告為final的並不保證陣列成員也是final的,這需要實現上的保證。這可以確保不會出現死鎖,因為獲得鎖的順序是固定的。

concurrenthashmap是由segment陣列結構和hashentry陣列結構組成。segment 是-種可重入鎖reentrantlock,在concurrenthashmap裡扮演鎖的角色,hashentry則用於儲存鍵值對資料。乙個concurrenthashmap裡包含乙個segment陣列,segment的結構和hashmap類似,是一種陣列和鍊錶結構,乙個segment裡包含乙個hashentry陣列,每個hashentry是乙個鍊錶結構的元素,每個segment守護者乙個hashentry 陣列裡的元素,當對hashentry陣列的資料進行修改時,必須首先獲得它對應的segment鎖

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