1. 程式人生 > >ConcurrentHashMap的介紹及優點

ConcurrentHashMap的介紹及優點

從JDK1.2起,就有了HashMap,正如前一篇文章所說,HashMap不是執行緒安全的,因此多執行緒操作時需要格外小心。

在JDK1.5中,偉大的Doug Lea給我們帶來了concurrent包,從此Map也有安全的了。


ConcurrentHashMap具體是怎麼實現執行緒安全的呢,肯定不可能是每個方法加synchronized,那樣就變成了HashTable。

從ConcurrentHashMap程式碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable,根據key.hashCode()來決定把key放到哪個HashTable中。

在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中:





測試程式:

  1. import java.util.concurrent.ConcurrentHashMap;  
  2. publicclass ConcurrentHashMapTest {  
  3.     privatestatic ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>();  
  4.     publicstaticvoid main(String[] args) {  
  5.         new Thread("Thread1"){  
  6.             @Override
  7.             publicvoid run() {  
  8.                 map.put(333);  
  9.             }  
  10.         };  
  11.         new Thread("Thread2"){  
  12.             @Override
  13.             publicvoid run() {  
  14.                 map.put(4
    44);  
  15.             }  
  16.         };  
  17.         new Thread("Thread3"){  
  18.             @Override
  19.             publicvoid run() {  
  20.                 map.put(777);  
  21.             }  
  22.         };  
  23.         System.out.println(map);  
  24.     }  
  25. }  

ConcurrentHashMap中預設是把segments初始化為長度為16的陣列。

根據ConcurrentHashMap.segmentFor的演算法,3、4對應的Segment都是segments[1],7對應的Segment是segments[12]。

(1)Thread1和Thread2先後進入Segment.put方法時,Thread1會首先獲取到鎖,可以進入,而Thread2則會阻塞在鎖上:


(2)切換到Thread3,也走到Segment.put方法,因為7所儲存的Segment和3、4不同,因此,不會阻塞在lock():


以上就是ConcurrentHashMap的工作機制,通過把整個Map分為N個Segment(類似HashTable),可以提供相同的執行緒安全,但是效率提升N倍,預設提升16倍。

相關推薦

ConcurrentHashMap介紹優點

從JDK1.2起,就有了HashMap,正如前一篇文章所說,HashMap不是執行緒安全的,因此多執行緒操作時需要格外小心。 在JDK1.5中,偉大的Doug Lea給我們帶來了concurrent包,從此Map也有安全的了。 ConcurrentHashMa

JavaWeb網上圖書商城完整項目--day03-1.圖書模塊功能介紹相關類創建

class default package ren 書籍 logs main java getc 1 前兩天我們學習了user用戶模塊和圖書的分類模塊,接下來我們學習圖書模塊 圖書模塊的功能主要是下面的功能: 2 接下來我們創建對應的包 我們來看看對應的數據庫表t_bo

C#數據緩存介紹Caching通用幫助類整理

能夠 eric article for generic arr stat ati cti C#緩存主要是為了提高數據的讀取速度。由於server和應用client之間存在著流量的瓶頸,所以讀取大容量數據時,使用緩存來直接為client服務,能夠降低client與serv

ssh介紹scp,sftp應用

network 服務器 數據安全 linux 數據包 一、ssh介紹 SSH是 secure Shell Protocol的簡寫,由IETF網絡工作小組(Network Working Group)制定;在進行數據傳輸之前 ,SSH先對聯機數據包通過加密技術進行加密處理,加密後再進行數據

自動化運維之saltstack(二)states介紹使用

配置文件 如何 states master 根目錄 一、什麽是Salt States?Salt States是Salt模塊的擴展,主系統使用的狀態系統叫SLS系統,SLS代表Saltstack State,Salt是一些狀態文件,其中包含有關如何配置Salt子節點的信息,這些狀態被存放在一

mongoDB簡單介紹安裝

疑問 每次 data- .org 存儲 cmd 針對 安裝包 目錄 近期一段時間對mongoDB進行了簡單的學習,從它是什麽?幹什麽?怎麽用?優缺點?這一系列的疑問到如今可以簡單運用。我想須要對其進行簡單的總結和概述。那麽這一篇就從最基礎的開始,對其

展示C代碼覆蓋率的gcovr工具簡單介紹相關命令使用演示樣例

文件夾 mes repo 例如 oid else if dir total down (本人正在參加2015博客之星評選,誠邀你來投票,謝謝:username=zhouzxi">http://vote.blog.csdn.net/blogstar2015

架構師之路--搜索業務和技術介紹容錯機制

朋友 單節點 adb 一致性 公司 一個 memcache 消息通知 包括  今天和搜索部門一起做了一下MQ的遷移,順便交流一下業務和技術。發現現在90後小夥都挺不錯。我是指能力和探究心。我家男孩,不招女婿。   在前面的文章中也提到,我們有媒資庫(樂視視頻音頻本身內容)

UltraEdit正則表達式介紹實例

官網 文檔 ltr 能夠 本科 min 組合 表達 使用方法 前幾天,有個將Excel中的數據導入到數據庫中的需求。原本想到用程序讀取Excel中的數據並存儲到數據庫中,但經一哥們的提醒,說用 EditPlus或UltraEdit這種工具直接將數據拼湊成SQL插

Opencv介紹opencv3.0在 vs2010上的配置

opencv介紹、opencv3.0在 vs2010上如何的配置 OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、R

C#操作Word Aspose.Words組件介紹使用—基本介紹與DOM概述

控制 包含 枚舉類 讀取 標記 服務器端 方法 python level 1.基本介紹 Aspose.Words是一個商業.NET類庫,可以使得應用程序處理大量的文件任務。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XP

Golang學習-第一篇 Golang的簡單介紹Windows環境下安裝、部署

需要 簡單 電腦 pan 生成文件 多核 -- pear () 序言 這是本人博客園第一篇文章,寫的不到位之處,希望各位看客們諒解。 本人一直從事.NET的開發工作,最近在學習Golang,所以想著之前學習的過程中都沒怎麽好好的將學習過程記錄下來。深感惋惜! 現在將Gola

樸素貝葉斯分類算法介紹python代碼實現案例

urn bus 人的 元素 1.2 -s index 代碼 步驟 樸素貝葉斯分類算法 1、樸素貝葉斯分類算法原理 1.1、概述 貝葉斯分類算法是一大類分類算法的總稱 貝葉斯分類算法以樣本可能屬於某類的概率來作為分類依據 樸素貝葉斯分類算法是貝葉斯分類算法中最簡單的一種 註:

RabbitMQ介紹安裝部署

lan 行數 安裝部署 原理圖 tro 快的 它的 主題 通配符 本節內容: RabbitMQ介紹 RabbitMQ運行原理 RabbitMQ重要術語 三種ExchangeType RabbitMQ集群種類 集群基本概念 鏡像模式部署集群 一、RabbitMQ介紹

Storm介紹安裝部署

節點和 yam 實時計算系統 如果 int 端口 bili usr then 本節內容: Apache Storm是什麽 Apache Storm核心概念 Storm原理架構 Storm集群安裝部署 啟動storm ui、Nimbus和Supervisor 一、Ap

Python零基礎學習系列之二--Python介紹環境搭建

url 軟件包 三方庫 簡單的 lin 文件的 span 高級程序設計 擴展 1-1、Python簡介:  Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年

Charles界面介紹使用方法

ade 當前 lin rewrite ip地址 鼠標滑過 列表 exp 自動 本隨筆主要內容: 一、Charles界面介紹 二、Charles使用 1.會話(Repeat、Focus、Compare、黑白名單等) 2.模擬請求做mock,使用斷點、Map或Rewrite

JSR-303 Bean Validation 介紹 Spring MVC 服務端驗證最佳實踐

unit clas pre 服務 技術 artifact object out otn 任何時候,當要處理一個應用程序的業務邏輯,數據校驗是你必須要考慮和面對的事情。 應用程序必須通過某種手段來確保輸入參數在上下文來說是正確的。 分層的應用在很多時候,

【能力提升】SQL Server常見問題介紹高速解決建議

轉移 連接數 運行時 方案 備份 登錄 rac 攻擊 cnblogs 前言   本文旨在幫助SQL Server數據庫的使用人員了解常見的問題。及高速解決這些問題。這些問題是數據庫的常規管理問題,對於非常多對數據庫沒有深入了解的朋友提供一個大概的常見問題框架。

elasticsearch集群介紹優化【轉】

tutorial status onf 出了 參考 算法 last num 和數 elasticsearch用於構建高可用和可擴展的系統。擴展的方式可以是購買更好的服務器(縱向擴展)或者購買更多的服務器(橫向擴展),Elasticsearch能從更強大的硬件中獲得更好的性能