Java并發編程之ConcurrentHashMap的原理和使用

ConcurrentHashMap(CHM)是Java為解決高并發場景下哈希表性能瓶頸而設計的線程安全容器,其核心目標在于:

  • 線程安全?:避免多線程操作導致的數據不一致問題?;
  • 高吞吐量?:通過細粒度鎖和無鎖化設計降低線程競爭?;
  • 動態擴展?:支持自動擴容與數據結構優化(如鏈表轉紅黑樹)?;

下面我們一起詳細看看ConcurrentHashMap的細節是什么樣的

一、ConcurrentHashMap 概述

?ConcurrentHashMap(CHM)? 是 Java 并發包中實現線程安全的哈希表,其核心設計目標是?在高并發場景下兼顧性能與線程安全?。與 HashTable 的全表鎖不同,CHM 通過?分段鎖(JDK7)?和?CAS+synchronized細粒度鎖(JDK8+)? 實現高效并發控制,解決了傳統同步容器的性能瓶頸?。

二、核心工作原理

2.1 數據結構的演進

1)JDK7 分段鎖機制?

  • 采用 ?Segment 數組 + HashEntry 鏈表? 的二級結構,每個 Segment 繼承 ReentrantLock,獨立管理一個子哈希表。?
  • 鎖粒度?:以 Segment 為鎖單位,不同 Segment 的寫操作可并行?。?
  • 缺點?:Segment 數量固定(默認16),擴容僅針對單個 Segment,無法全局動態調整?。

2)?JDK8+ 優化設計?

  • Node 數組 + 鏈表/紅黑樹?:取消 Segment,直接使用 Node 數組,鏈表長度超過8時轉為紅黑樹(避免哈希沖突導致的性能退化)?。
  • 鎖粒度細化?:僅對單個桶(Node 數組元素)加鎖(通過 synchronized 和 CAS),并發度更高?。

具體版本對比如下
在這里插入圖片描述

2.2 線程安全機制

1)CAS(Compare And Swap)?:用于無鎖化更新頭節點、統計元素數量(如 sizeCtl)等場景,減少線程阻塞?。
2?)Synchronized 鎖?:針對具體桶(Node)加鎖,僅當哈希沖突時觸發,避免全局鎖競爭?。
?3)Volatile 變量?:保證內存可見性,如 Node.val 和 next 指針均用 volatile 修飾?。

2.3 JDK8實現原理和源碼解析

1)核心數據結構

// Node節點定義(鏈表結構)  
static class Node<K,V> implements Map.Entry<K,V> {  final int hash;  final K key;  volatile V val;          // 保證可見性  volatile Node<K,V> next; // 保證可見性  // ...  
}  // TreeNode節點(紅黑樹結構)  
static final class TreeNode<K,V> extends Node<K,V> {  TreeNode<K,V> parent;  TreeNode<K,V> left;  TreeNode<K,V> right;  TreeNode<K,V> prev;  boolean red;  
}  

設計要點?:

  1. volatile修飾?:val和next字段確保內存可見性?;
  2. 樹化

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

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

相關文章

AbMole揭秘傷口愈合:IGF-1-SP1-CD248信號通路的新發現

科學家們揭示了一條新的信號通路——IGF-1-SP1-CD248&#xff0c;這一發現為理解傷口愈合障礙提供了新的視角&#xff0c;并為未來的研究開辟了新方向。 研究背景 糖尿病患者的傷口愈合是一個長期存在的挑戰。據統計&#xff0c;約15%的糖尿病患者會遭受慢性傷口的困擾&#…

Go入門之文件

以只讀方式打開文件 package mainimport ("fmt""io""os" )func main() {file, err : os.Open("./main.go")defer file.Close()if err ! nil {fmt.Println(err)return}fmt.Println(file)var tempSlice make([]byte, 128)var strSlice…

python量化交易——金融數據管理最佳實踐——使用qteasy管理本地數據源

文章目錄 統一定義的金融歷史數據表最重要的數據表數據表的定義交易日歷表的定義&#xff1a;交易日歷表: trade_calendar qteasy是一個功能全面且易用的量化交易策略框架&#xff0c; Github地址在這里。使用它&#xff0c;能輕松地獲取歷史數據&#xff0c;創建交易策略并完…

通過 PromptTemplate 生成干凈的 SQL 查詢語句并執行SQL查詢語句

問題描述 在使用 LangChain 和 Llama 模型生成 SQL 查詢時&#xff0c;遇到了 sqlite3.OperationalError 錯誤。錯誤信息如下&#xff1a; OperationalError: (sqlite3.OperationalError) near "sql SELECT Name FROM MediaType LIMIT 5; ": syntax error [SQL: …

STaR(Self-Taught Reasoner)方法:讓語言模型自學推理能力(代碼實現)

STaR&#xff08;Self-Taught Reasoner&#xff09;方法&#xff1a;讓語言模型自學推理能力 在大型語言模型&#xff08;LLM&#xff09;的推理能力優化中&#xff0c;STaR&#xff08;Self-Taught Reasoner&#xff09; 是一種引人注目的技術&#xff0c;屬于“修改提議分布…

Asp.Net Web API| React.js| EF框架 | SQLite|

asp.net web api EF SQLiteReact前端框架 設計一個首頁面&#xff0c;包含三個按鈕分別對應三類用戶&#xff08;數據查看&#xff0c;設計人員&#xff0c;管理員&#xff09;&#xff0c;當點擊管理員的時候彈出一個前端頁面可以輸入信息&#xff08;以學生數據為例&#…

[SWPUCTF 2022 新生賽]1z_unserialize

題目描述&#xff1a;是很簡單的反序列化噢 代碼審計看注釋 <?phpclass lyh{ //定義一個類為lyhpublic $url NSSCTF.com;//公共屬性&#xff0c;初始值為NSSCTF.compublic $lt; //公共屬性&#xff0c;沒有初始值public $lly; //公共屬性&…

【數據庫】Update兩階段提交

為什么要兩階段提交 事務提交之后&#xff0c;redo log和bin log 都是需要1持久化到磁盤中&#xff0c;但是這兩個是獨立的邏輯&#xff0c;可能出現半成功的狀態&#xff0c;這樣就造成兩份日志之間的邏輯不一致。如&#xff1a; 以id1&#xff0c;name ‘小明’執行 updat…

【藍橋】排序

1、sort簡介 sort函數包含在頭文件<algorithm>中sort函數使用之前&#xff0c;需要通過#include <algorithm>引入sort函數使用的是快速排列或類似快速排列的改進算法&#xff0c;時間復雜度一般為O(nlog(n)) 2、sort用法 2.1 基礎用法 #include <iostream>…

2024年中國城市統計年鑒(PDF+excel)

2024年中國城市統計年鑒&#xff08;PDFexcel&#xff09; 說明&#xff1a;包括地級縣級市 格式&#xff1a;PDFEXCEL 《中國城市統計年鑒》是一部全面反映中國城市發展狀況的官方統計出版物&#xff0c;包括各級城市的詳細統計數據。這部年鑒自1985年開始出版&#xff0c;…

android 資源selector寫法注意

1、res文件夾下面color文件夾,放的xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/color_brand1" android:s…

藍橋杯 燈籠大亂斗【算法賽】

問題描述 元宵佳節&#xff0c;一場別開生面的燈籠大賽熱鬧非凡。NN 位技藝精湛的燈籠師依次落座&#xff0c;每位師傅都有相應的資歷值&#xff0c;其中第 ii 位師傅的資歷值為 AiAi?。從左到右&#xff0c;師傅們的資歷值逐級遞增&#xff08;即 A1<A2<?<ANA1?&l…

商城源碼的框架

商城源碼的框架通常是基于某種Web開發框架或者電子商務平臺來構建的。以下是一些常見的商城源碼框架&#xff1a; WooCommerce&#xff1a;基于WordPress的電子商務插件&#xff0c;適用于小型到中型的在線商店。 Magento&#xff1a;一個功能強大和靈活的開源電子商務平臺&am…

HarmonyOS 5.0應用開發——多線程Worker和@Sendable的使用方法

【高心星出品】 文章目錄 多線程Worker和Sendable的使用方法開發步驟運行結果 多線程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一種多線程的實現方式&#xff0c;它允許開發者在后臺線程中執行長耗時任務&#xff0c;從而避免阻塞主線程并提高應用的響應性。 S…

避坑!用Docker搞定PHP開發環境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是對環境版本進行了更新&#xff0c;例如php 7.3.7升級到了7.3.8&#xff0c;另外之前的版本有同學踩了坑&#xff0c;主要是官方docker鏡像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面會提到&#xff0c;請各位同學留意。 因為最近換電腦…

自動化測試開發

4、Servlet模型&#xff08;一&#xff09; Servlet的編寫、訪問過程 Servlet簡介 Servlet是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于獲取請求&#xff0c;返回響應廣義&#xff1a;一個Ser…

24、Java 集合

十一章&#xff1a;Java 集合 一、集合框架的概述 1、集合&#xff1a;就像一個容器&#xff0c;可以動態的把多個對象的引用放入容器中。簡稱 Java 容器 ? 說明&#xff1a;此時的存儲&#xff0c;主要指的是內存層面的存儲&#xff0c;不涉及到持續化的存儲&#xff08;.t…

1114棋盤問題acwing(深度優先搜索)

題目描述 在一個給定形狀的棋盤&#xff08;形狀可能是不規則的&#xff09;上面擺放棋子&#xff0c;棋子沒有區別。 要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列&#xff0c;請編程求解對于給定形狀和大小的棋盤&#xff0c;擺放 kk 個棋子的所有可行的擺放…

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中&#xff0c;提供了logback日志輸出配置范例&#xff0c;實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫&#xff0c;針對特定場景提供輕量解決方案&#xff0c;只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中&#xff0c;測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發&#xff0c;成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…