1. 程式人生 > >ConcurrentHashMap工作原理

ConcurrentHashMap工作原理

JDK1.8以下
ConcurrentHashMap採用了分段鎖的設計,只有在同一個分段內才存在競態關係,不同的分段鎖之間沒有鎖競爭。
相比於對整個Map加鎖的設計,分段鎖大大的提高了高併發環境下的處理能力。


ConcurrentHashMap中的分段鎖稱為Segment


同時又是一個ReentrantLock(Segment繼承了ReentrantLock)。


併發度可以理解為程式執行時能夠同時更新ConccurentHashMap且不產生鎖競爭的最大執行緒數,
實際上就是ConcurrentHashMap中的分段鎖個數,
即Segment[]的陣列長度。ConcurrentHashMap預設的併發度為16,
但使用者也可以在建構函式中設定併發度。當用戶設定併發度時,ConcurrentHashMap會使用大於等於該值的最小2冪指數作為實際併發度(假如使用者設定併發度為17,實際併發度則為32)。


如果併發度設定的過小,會帶來嚴重的鎖競爭問題;如果併發度設定的過大,原本位於同一個Segment內的訪問會擴散到不同的Segment中,CPU cache命中率會下降,從而引起程式效能下降。






JDK1.8
它摒棄了Segment(鎖段)的概念,而是啟用了一種全新的方式實現,利用CAS演算法。
它沿用了與它同時期的HashMap版本的思想,底層依然由“陣列”+連結串列+紅黑樹的方式思想(JDK7與JDK8中HashMap的實現),但是為了做到併發,又增加了很多輔助的類,
例如TreeBin,Traverser等物件內部類。


Node是最核心的內部類,它包裝了key-value鍵值對,所有插入ConcurrentHashMap的資料都包裝在這裡面。
它與HashMap中的定義很相似,但是但是有一些差別它對value和next屬性設定了volatile同步鎖(與JDK7的Segment相同),
它不允許呼叫setValue方法直接改變Node的value域,它增加了find方法輔助map.get()方法。




TreeNode(樹節點類),另外一個核心的資料結構。當連結串列長度過長的時候,會轉換為TreeNode。
但是與HashMap不相同的是,它並不是直接轉換為紅黑樹,而是把這些結點包裝成TreeNode放在TreeBin物件中,由TreeBin完成對紅黑樹的包裝。
而且TreeNode在ConcurrentHashMap整合自Node類,而並非HashMap中的整合自LinkedHashMap.Entry<K,V>類,也就是說TreeNode帶有next指標,這樣做的目的是方便基於TreeBin的訪問。


TreeBin這個類並不負責包裝使用者的key、value資訊,而是包裝的很多TreeNode節點。
它代替了TreeNode的根節點,也就是說在實際的ConcurrentHashMap“陣列”中,存放的是TreeBin物件,而不是TreeNode物件,這是與HashMap的區別。
另外這個類還帶有了讀寫鎖。




CAS演算法
這個方法是利用一個CAS演算法實現無鎖化的修改值的操作,他可以大大降低鎖代理的效能消耗。
這個演算法的基本思想就是不斷地去比較當前記憶體中的變數值與你指定的一個變數值是否相等,如果相等,則接受你指定的修改的值,否則拒絕你的操作。


整個擴容操作分為兩個部分
第一部分是構建一個nextTable,它的容量是原來的兩倍,這個操作是單執行緒完成的。這個單執行緒的保證是通過RESIZE_STAMP_SHIFT這個常量經過一次運算來保證的,這個地方在後面會有提到;
第二個部分就是將原來table中的元素複製到nextTable中,這裡允許多執行緒進行操作。




put()方法
有一個最重要的不同點就是ConcurrentHashMap不允許key或value為null值。另外由於涉及到多執行緒,put方法就要複雜一點。在多執行緒中可能有以下兩個情況
如果這個位置是空的,那麼直接放入,而且不需要加鎖操作


至於為什麼JDK8中使用synchronized而不是ReentrantLock,我猜是因為JDK8中對synchronized有了足夠的優化吧。

相關推薦

Java8 中 ConcurrentHashMap工作原理的要點分析

tail dtree outer initial 而不是 ubd rule 設定 tree 簡介: 本文主要介紹Java8中的並發容器ConcurrentHashMap的工作原理,和其它文章不同的是,本文重點分析了不同線程的各類並發操作如get,put,remove之間是如

Java集合-ConcurrentHashMap工作原理和實現JDK7

概述 本文學習知識點 1.ConcurrentHashMap與HashMap的區別。 2.資料儲存結構。 3.如何提高併發讀寫效能。 4.put和get方法原始碼實現分析。 5.size方法如何實現。 與HashMap的區別 1.ConcurrentHashMap和Ha

Java集合-ConcurrentHashMap工作原理和實現JDK8

概述 本文主要介紹ConcurrentHashMap在JDK8中的原始碼實現和原理。在JDK8中,開發人員幾乎把ConcurrentHashMap的原始碼重寫了一遍,原始碼由之前的2000多行增加到了6300行左右,因此實現也就複雜很多。在學習之前,最好先了解下如下知識: 1、Ree

ConcurrentHashMap工作原理

JDK1.8以下 ConcurrentHashMap採用了分段鎖的設計,只有在同一個分段內才存在競態關係,不同的分段鎖之間沒有鎖競爭。 相比於對整個Map加鎖的設計,分段鎖大大的提高了高併發環境下的處理能力。 ConcurrentHashMap中的分段鎖稱為Segment

HashMap、HashTable及ConcurrentHashMap區別及工作原理

前言 第一次寫部落格,水平有限可能有理解不到位或理解錯的地方。歡迎各位大神參與討論或指正。 Map在工作中的使用頻率較高,HashMap相關的問題在面試中也經常被問到。所以抽空在網上找資料對它們進行了系統的學習,作出以下幾點總結: HashMap、Hash

VMware快照的工作原理

所有 整合 100g 性能 不變 小時 此外 建立 console VMware中的快照是對VMDK在某個時間點的“拷貝”,這個“拷貝”並不是對VMDK文件的復制,而是保持磁盤文件和系統內存在該時間點的狀態,以便在出現故障後虛擬機能夠恢復到該時間點。如果對某個虛擬機創建了多

Vue工作原理小結

key 如何實現 reference 讀寫 owa 方法 cli scrip 枚舉 本文能幫你做什麽?1、了解vue的雙向數據綁定原理以及核心代碼模塊2、緩解好奇心的同時了解如何實現雙向綁定為了便於說明原理與實現,本文相關代碼主要摘自vue源碼, 並進行了簡化改造,相對較

angularjs工作原理解析

body oot 分隔 復制 抖動 修改 重新 接收 裏的 個人覺得,要很好的理解AngularJS的運行機制,才能盡可能避免掉到坑裏面去。在這篇文章中,我將根據網上的資料和自己的理解對AngularJS的在啟動後,每一步都做了些什麽,做一個比較清楚詳細的解析。 首

shell編程培訓之shell的工作原理

shell編程培訓Shell是用戶和Linux操作系統之間的接口。Linux中有多種shell,其間缺省運用的是Bash。本章敘述了shell的作業原理,shell的品種,shell的一般操作及Bash的特性。什麽是shellLinux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的接口。它是命令

session rsyns 的工作原理

session rsyns 的工作原理session的工作原理 1.session實現與工作原理瀏覽器和服務器采用http無狀態的通訊,為了保持客戶端的狀態,使用session來達到這個目的。然而服務端是怎麽樣標示不同的客戶端或用戶呢?這裏我們可以使用生活中的一個例子,假如你參加一個晚會,認識了很多人,你會采

CGI的工作原理

設置 mark 之間 com 環境變量 沒有 mar 輸出 表單 CGI是Webserver和外部程序之間的一個接口。利用CGI程序能夠處理從Web上client發送出來的表單和數據。並對此做出相關操作。這樣的反應能夠是HTML文件、圖片、聲音、視頻等能夠在瀏覽器窗口

struts2工作原理

struts archive logs tro images src str hive www 摘取於:http://www.cnblogs.com/jy02444453/archive/2011/08/27/2155427.html struts2工作原理

USB Type-C工作原理解析

說明 是否 forms dfp 其他 耗時 def 左右 del 自從蘋果發布了新MacBook,USB Type-C接口就成為了熱議對象。我來從硬件角度解析下這個USB Type-C,以便大家更好的了解USB Type-C的工作原理。特色尺寸小,支持正反插,速度快(10G

session 的工作原理

銷毀 這樣的 機制 過期 登陸 處理 art 客戶端瀏覽器 生成 一直在使用session存儲數據,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這裏做一下梳理。這裏的介紹主要是基於php語言,其他的語言操作可能會有差別,但基本的原理不變。 1.在p

SpringMVC的工作原理

free 視圖渲染 jstl resp mapping div 更多 con lib 一、spring簡介     springMVC是spring框架的一個模塊,springMVC和spring無需通過中間整合層進行開發。 springMVC是一個基於mvc的

Nginx 模塊的工作原理

nginx 模塊的工作原理Nginx 模塊的工作原理 Handlers :(處理器模塊)此模塊直接處理請求 並且進行內容傳輸以及修改headres信息等操作。Handlers模塊只能處理一個。Filters(處理器模塊):此類模塊只需要對其他服務器模塊輸出的內容進行修改操做,最後又Nginx操做proxies

路由器工作原理

htm 一個 aid 提高 通信 最好 原理 有一種 clas 主機A和主機B所在的網段被許多路由器隔開,這是主機A與主機B的通信就要進過這些中間路由器,這就要面臨一個很重要的問題,如何選擇到達目的地的路徑。包從A到達B有很多條路徑可供選擇,但是很顯然,在這些路徑中在某一

linux設備驅動之platform平臺總線工作原理(三)

linux設備和驅動設備為數據,驅動為加工著1、以led-s3c24xx.c為例來分析platform設備和驅動的註冊過程其中關於led的驅動數據結構為:static struct platform_driver s3c24xx_led_driver = { .probe = s3c24xx_led_pr

zabbix簡介與工作原理

zabbix簡介與工作原理註;如有雷同純屬巧合。1.zabbix簡介zabbix(音同 zbix)是一個基於WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案zabbix能監視各種網絡參數,保證服務器系統的安全運營;並提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。zabbix

深度解析線程工作原理

路徑 cep dead test deadlock end priority interrupt prior   1, 線程的概念     一個程序中的方法有幾條執行路徑, 就有幾個線程   2, 線程的創建     兩種方式:       1, 繼承Thread