從原始碼分析ConcurrentHashMap執行緒安全和高效的特性
在IDEA裡面通過ctrl+n搜尋ConcurrentHashMap類
這樣就得到了ConcurrentHashMap類的原始碼
再在這個類中通過ctrl+f12查詢類中的方法put
在put方法裡分析原始碼看它為什麼可以實現執行緒安全而又高效
在put方法裡可以看到它呼叫了putVal方法
所以需要再到putVal方法裡去檢視
(最後一句tab = helpTransfer是在給儲存hash碼值的陣列tab擴容)
cas演算法
拿期望值去比較要替換的變數
如果一樣 就把新值替換上去
如果不一樣 就不進行替換
因為當沒有人在動要替換的變數時 期望值和要替換的那個變數將會是一樣的 反之說明有人在動這個變數 如果進行替換則會產生執行緒安全的問題
沒有替換成功 將會進行迴旋 再取替換的變數進行和期望值的比較 直至一樣進行替換
即在別人改完後再進行替換 就不會有執行緒安全的問題
通過這個演算法實現執行緒安全
繼續往下看
它針對對應一個hash碼值的連結串列或者紅黑樹進行上鎖
而不是針對所有hash碼值的所有連結串列或紅黑樹上鎖 即分段上鎖
通過這種方式實現高效而且執行緒安全
相關文章
- ConcurrentHashMap執行緒安全機制以及原始碼分析HashMap執行緒原始碼
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- ConcurrentHashMap原始碼解析,多執行緒擴容HashMap原始碼執行緒
- 【Java】ConcurrentHashMap執行緒安全技巧JavaHashMap執行緒
- 從原始碼分析非執行緒安全集合類的不安全迭代器原始碼執行緒
- 多執行緒高併發程式設計(10) -- ConcurrentHashMap原始碼分析執行緒程式設計HashMap原始碼
- ConcurrentHashMap一定執行緒安全?HashMap執行緒
- 執行緒池原始碼分析執行緒原始碼
- ConcurrentHashMap的size方法是執行緒安全的嗎?HashMap執行緒
- quartz執行緒管理的原始碼分析quartz執行緒原始碼
- dubbo原始碼-執行緒池分析原始碼執行緒
- 從原始碼的角度解析執行緒池執行原理原始碼執行緒
- 從 JDK 原始碼角度看執行緒的阻塞和喚醒JDK原始碼執行緒
- 編寫高效的執行緒安全類執行緒
- netty原始碼分析-執行緒池Netty原始碼執行緒
- 從原始碼角度分析建立執行緒池究竟有哪些方式原始碼執行緒
- ConcurrentHashMap 原始碼分析HashMap原始碼
- 執行緒安全和執行緒不安全理解執行緒
- 原始碼|從序列執行緒封閉到物件池、執行緒池原始碼執行緒物件
- strerror執行緒安全分析Error執行緒
- 執行緒池之ThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- 執行緒池之ScheduledThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- hashmap和concurrenthashmap原始碼分析(1.7/1.8)HashMap原始碼
- ConcurrentHashMap 實現原理和原始碼分析HashMap原始碼
- Dubbo RPC執行緒模型 原始碼分析RPC執行緒模型原始碼
- 執行緒池的建立和使用,執行緒池原始碼初探(篇一)執行緒原始碼
- Android 原始碼分析(三)安卓中的執行緒Android原始碼安卓執行緒
- 詳解Java執行緒池的ctl(執行緒池控制狀態)【原始碼分析】Java執行緒原始碼
- 程式碼審查:從 ArrayList 說執行緒安全執行緒
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 多執行緒十二之ConcurrentHashMap1.8實現分析執行緒HashMap
- 從原始碼角度解析執行緒池中頂層介面和抽象類原始碼執行緒抽象
- Python執行緒池ThreadPoolExecutor原始碼分析Python執行緒thread原始碼
- jdk1.8 執行緒池部分原始碼分析JDK執行緒原始碼
- Java多執行緒之Thread原始碼分析Java執行緒thread原始碼
- 多執行緒基礎(十九):Semaphore原始碼分析執行緒原始碼
- libgo原始碼分析之多執行緒協程管理和排程Go原始碼執行緒