ConcurrentHashMap擴容機制

ConcurrentHashMap的擴容為了提高效率,是多線程并發

每個線程控制一部分范圍節點的擴容(根據cpu與數組長度確定控制多大范圍)

有兩個核心參數

sizeCtl:標記擴容狀態 負數時代表正在擴容,存儲量參與擴容的線程數,正數代表出發擴容的閾值

transferIndex:表示當前等待遷移的舊表的最大索引(由高到低遷移 )若map數組長度為16則就該值的初時值是15

需要注意的是進行擴容的線程并不是Map自己創建的,而是抓的壯丁!誰觸發,誰就被抓來協助擴容。

既然是多線程并發,那就一定是每個線程負責一部分,怎么確定哪些線程負責那些部分,避免重復遷移呢?這就要用到transferIndex,

所有線程嘗試去獲取自己負責的部分時,都要嘗試cas修改這個值,注意每次的獲取是分塊的,有一個stide 每個線程至少是16個,即16個桶,cas修改transferIndex后就開始遷移元素。

元素的遷移過程中,線程會依次獲取自己負責范圍內的鎖桶,注意不是一口氣全拿,而是遷移一個拿一個,遷移完就釋放,確保其他線程可正常讀寫還沒有被遷移的桶。遷移完后的桶的頭結點會被標記成ForwardingNode,表示該桶已被遷移,此時若有線程讀取該桶的數據,則會到新表中取查詢。

遷移時也會根據高低位來判斷是否要遷移,將舊桶的鏈表拆分為兩個鏈表(低位鏈表和高位鏈表),分別放到新表的?i和?i + oldCapacity位置。

??紅黑樹遷移??:類似鏈表,但需檢查拆分后的節點數量,若小于?UNTREEIFY_THRESHOLD(默認 6),則退化為鏈表

遷移完成前并不會真正斷開舊表對元素的引用,這樣對與正在遷移的桶,可以直接get其中的元素

最后完成擴容后會用nexttable 替換舊表

并修改sizeCtl會新容量的0.75倍

遷移過程中的put和get

get:若未被遷移直接讀,被遷移(發現頭結點是ForwardingNode,會跳轉到對應的新表節點)從新表中讀

put:會主動協助擴容,寫操作一定要獲取到桶鎖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95943.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Cloud Gateway 進行集群化部署

如果將 Gateway 單獨部署為一個服務而不做任何高可用處理,它確實會成為一個單點故障(SPOF, Single Point of Failure)。如果這個唯一的 Gateway 實例因為服務器宕機、應用崩潰、部署更新或其他任何原因而不可用,那么整個系統的所有…

計算機網絡:以太網中的數據傳輸

以太網中,數據的傳輸依賴于一系列標準化的技術規范,核心包括幀結構封裝、介質訪問控制機制和物理層編碼技術,具體如下: 1. 以“幀(Frame)”為基本傳輸單元 以太網在數據鏈路層將網絡層的數據包(…

元器件--USB TypC接口

USB TypC接口下圖這些都是USB接口A口與B口的區別USB A口和B口最初由USB-IF在1996年引入。根據當時的USB協議,A口主要用于主設備(如電腦),而B口則用于從設備(如打印機和攝像頭)。隨著USB-C接口的日益普及&am…

多線程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)異常

多線程之HardCodedTarget(typeOssFileClient, namefile, urlhttp://file)異常 摘要: 文檔描述了多線程環境下調用Feign客戶端OssFileClient時出現的HardCodedTarget異常。異常發生在異步保存文件到ES時,Feign調用未返回預期結果而直接打印了客戶端對象。…

計算機視覺(十二):人工智能、機器學習與深度學習

人工智能 (AI):宏大的目標 人工智能是最廣泛、最宏大的概念,它的目標是讓機器能夠模仿人類的智能行為,例如: 推理:像下棋程序一樣,通過邏輯來做決策。規劃:為實現一個目標而制定步驟&#xff0c…

容器元素的滾動條回到頂部

關閉再打開后,容器元素的滾動條回到頂部解決方法:1、通過打開開發者工具(F12),找到滾動條所屬元素為 el-textarea__inner,其父類 class"el-textarea content"2、代碼,通過元素的方法 …

分布式專題——2 深入理解Redis線程模型

1 Redis 簡介 1.1 Redis 是什么? Redis 全稱 Remote Dictionary Server(遠程字典服務),是一個開源的高性能 Key-Value 數據庫; 官網:Redis - The Real-time Data Platform; 引用官網上的?個…

simd學習

如何查看cpu是否支持simd?# 檢查特定指令集 grep -o avx2 /proc/cpuinfo | head -1 # 檢查AVX2 grep -o sse4 /proc/cpuinfo | head -1 # 檢查SSE4 grep -o avx512 /proc/cpuinfo | head -1 # 檢查AVX512gcc編譯選項,增加支持simd-mavx2 -D__AVX2__SS…

LabVIEW汽車發動機振動測試

以某型號四缸汽油發動機為測試對象,借助 LabVIEW 平臺與高精度數據采集硬件,開展發動機全工況振動測試。通過實時采集缸體、曲軸箱關鍵部位振動信號,分析振動特征與故障關聯,驗證發動機運行穩定性,為后期優化設計提供數…

android 四大組件—Service

啟動服務startService//啟動服務,通過類名 Intent intent new Intent(this, WiFiAutoLinkService.class); startService(intent); //通過字符串啟動 Intent intent new Intent(); intent.setAction("com.launcher.app"); intent.setPackage("com.l…

https + 域名 + 客戶端證書訪問模式

項目使用金融云部署,對外暴露IP訪問,因安全合規要求必須使用域名訪問,但公司又不提供域名。故,改為 https 域名 客戶端證書雙向認證 訪問模式,大大提升安全性。 1. 密鑰文件類型 .key、.csr、.cer(或 .cr…

ICPC 2023 Nanjing R L 題 Elevator

[ProblemDiscription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription] 來源:洛谷。侵權則刪。 [Analysis]\color{blue}{\texttt{[Analysis]}}[Analysis] 貪心。優先運送樓層高的貨物,在能裝下的情況下盡量多裝。 因為運送貨物的代價…

81-dify案例分享-零代碼用 Dify 使用夢 AI 3.0 多模態模型,免費生成影視級視頻

1.前言 即夢AI作為字節跳動旗下的AI繪畫與視頻生成平臺,近年來不斷推出新的模型和功能,以提升用戶體驗和創作能力。 即夢AI 3.0是即夢AI的最新版本,于2025年4月發布,標志著其在中文生圖模型上的重大升級。該版本不僅在中文生圖能…

SQL 進階指南:視圖的創建與使用(視圖語法 / 作用 / 權限控制)

在 SQL 操作中,你是否遇到過 “頻繁查詢多表關聯的固定結果”“不想讓他人看到表中的敏感字段” 這類問題?比如 “每周都要查‘技術部員工的姓名、職位、薪資’”,每次都寫多表關聯語句很麻煩;又比如 “給實習生開放數據查詢權限&…

【全部更新完畢】2025數學建模國賽C題思路代碼文章高教社杯全國大學生數學建模-NIPT 的時點選擇與胎兒的異常判定

B題全部更新完畢 包含完整的文章全部問題的代碼、結果、圖表 完整內容請看文末最后的推廣群NIPT 的時點選擇與胎兒的異常判定 摘要 在問題一中,我們以無創產前檢測(NIPT)數據為研究對象,圍繞“胎兒 Y 染色體濃度”(記為 (V)) 隨孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel(哨兵)是一種用于管理 Redis 實例的高可用性解決方案。它提供了監控、通知和自動故障轉移等功能,確保 Redis 服務在發生故障時能夠自動恢復,提供高可用性和可靠性。以下是詳細介紹 Redis Sentinel 的功能及其代碼示…

蓓韻安禧DHA純植物藻油純凈安全零添加守護母嬰健康

在母嬰健康領域,選擇合適的營養補充品至關重要。純植物藻油DHA源自純凈藻類,有效規避了海洋重金屬污染的風險,確保安全無隱患。配方堅持零添加香精、色素和防腐劑,避免不必要的化學物質攝入,讓媽媽和寶寶更安心。同時&…

釘釘 AI 深度賦能制造業 LTC 全流程:以釘釘宜搭、Teambition 為例

制造業 LTC 流程痛點剖析?在制造業,線索到現金(LTC,Lead to Cash)的全流程包含從潛在客戶線索的發現、商機培育、銷售轉化、訂單執行到最終收款的一系列復雜環節。傳統制造業在這一流程中面臨諸多挑戰:客戶需求的多樣…

理解UE4中C++17的...符號及enable_if_t的用法及SFINAE思想

下面是一段C17的代碼&#xff1a;//函數1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建設精品采購指南》案例首推運營商行業數據安全核心推薦廠商

在數字經濟加速滲透與《網絡數據安全管理條例》全面實施的雙重背景下&#xff0c;運營商作為數據要素流通的核心樞紐&#xff0c;其安全防護體系建設已成為數字基礎設施保障的關鍵環節。近日&#xff0c;安全 419 正式公布《甲方安全建設精品采購指南》&#xff0c;從近 300 個…