線程安全的哈希表ConcurrentHashMap

1. HashTable

不推薦使用,無腦給各種方法加鎖

2.ConcurrentHashMap

多線程下推薦使用

  1. 鎖粒度控制

HashTable直接在方法上加synchronized,相當于對哈希表對象加鎖,一個哈希表只有一把鎖。多線程環境下,無論線程如何操作哈希表,都會產生鎖沖突。
image.png
而ConcurrentHashMap每個哈希桶都有自己的鎖,哈希表中哈希桶數量很多,大大降低了鎖沖突的概率,性能也大大提升。
image.png

  1. ConcurrentHashMap只對寫加鎖,讀操作不加鎖

也就是說兩個線程同時修改,才會有鎖沖突;兩個線程都讀,沒有鎖沖突;一個線程寫,一個線程讀,也沒有鎖沖突。
為什么一個線程讀一個線程寫沒有鎖沖突?
難道不會讀到修改一半的數據嗎?ConcurrentHashMap在設計的時候,考慮到這個問題,所以保證在讀的時候一定是讀到一整數據(要么是舊版本,要么是新版本,不會是讀到一半的數據)。
并且讀操作也廣泛使用volatile保證讀到的數據是及時的。

  1. 充分利用CAS特性

像維護元素個數就是通過CAS實現,而不是加鎖;以及使用CAS實現輕量級鎖/自旋鎖等等。

  1. 對擴容進行特殊處理

HashTable的擴容:當put元素時,發現負載因子超過閾值就觸發擴容,申請一個更大的數組,把原來舊的數據搬運到新的數組上。
上述擴容方式存在很大問題,當元素個數特別多的時候,搬運操作就會開銷非常大。put操作不需要擴容時瞬間完成O(1),但是觸發擴容時就可能卡很久。
ConcurrentHashMap的擴容的時候,舊的數組和新的數組是同時存在的,每次進行哈希表操作都會把舊數組上的元素搬運一部分到新數組上,直到全部搬運完,再釋放舊的空間。在這個過程中如果要查詢元素,舊的數組和新的數組一起查;如果要插入元素,直接往新數組上插入;如果是刪除元素,直接刪除不用搬運。

  1. 面試題:HashMap,HashTable,ConcurrentHahMap的區別?

先說HashMap是線程不安全的,HashTable,ConcurrentHashMap是線程安全的。
再談ConcurrentHashMap的優化

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

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

相關文章

深入理解Dubbo-3.高級功能剖析和原理解析

👏作者簡介:大家好,我是愛吃芝士的土豆倪,24屆校招生Java選手,很高興認識大家📕系列專欄:Spring源碼、JUC源碼、Kafka原理、分布式技術原理🔥如果感覺博主的文章還不錯的話&#xff…

利用貝葉斯超參數優化,提升模型效果更科學(附Python代碼)

超參數優化在大多數機器學習流水線中已成為必不可少的一步,而貝葉斯優化則是最為廣為人知的一種“學習”超參數優化方法。 超參數優化的任務旨在幫助選擇學習算法中成本(或目標)函數的一組最佳參數。這些參數可以是數據驅動的(例…

【UE5】初識MetaHuman 創建虛擬角色

步驟 在UE5工程中啟用“Quixel Bridge”插件 打開“Quixel Bridge” 點擊“MetaHumans-》MetaHuman Presets UE5” 點擊“START MHC” 在彈出的網頁中選擇一個虛幻引擎版本,然后點擊“啟動 MetaHuman Creator” 等待一段時間后,在如下頁面點擊選擇一個人…

Apipost版IDEA插件:Apipost-Helper

Apipost-Helper是由Apipost推出的IDEA插件,寫完接口可以進行快速調試,且支持搜索接口、根據method跳轉接口,還支持生成標準的API文檔,注意:這些操作都可以在代碼編輯器內獨立完成,非常好用!這里…

Tair(2):Tair安裝部署

1 安裝相關依賴庫 yum install -y gcc gcc-c make m4 libtool boost-devel zlib-devel openssl-devel libcurl-devel yum:是yellowdog updater modified 的縮寫,Linux中的包管理工具gcc:一開始稱為GNU C Compiler,也就是一個C編…

N皇后,回溯【java】

問題描述 八皇后問題是十九世紀著名的數學家高斯于1850年提出的。 問題是:在88的棋盤上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上。可以把八皇后問題擴展到n皇后問題,即在nn的棋盤上擺…

管理類聯考——數學——真題篇——按知識分類——幾何

文章目錄 2023真題(2023-07)-幾何-解析幾何-最值真題(2023-10)-幾何-立體幾何-正方體:體積: V = a 3 V=a^3 V

AX和A(T)X的區別是?

目錄 1.快速了解的例子: (1)假設所有節點的初始特征都是[1, 0, 0] ,那么AX的結果是: (2) 的結果是: (3) 總結: 2.計算結構系數的例子 (1&#xff09…

day45-46-Vue+ElementUI實現學生管理

VueElementUI實現學生管理 代碼: qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考慮需求(登錄,查詢全部,基本增刪改查,分頁,搜索,批量) 設計數據庫搭建項目 后端…

2024美賽備戰2--模型建立(*****必看****)

建模 美賽涉及的建模知識范圍非常廣且深,縱觀美賽真題不難發現,很多的模型 都是讀研或者讀博的時候才會真正深入開始研究,因此,對于做建模的同學來說, 是無法在賽前吃透大量模型的。推薦本科生分兩個步驟去有效準備比賽…

【S32DS RTD實戰】-1.3-S32K3工程生成S19,BIN,Hex文件,以及Post-build steps的妙用

目錄 1 方法一:逐個生成Motorola S-record(s19,srec…),Intel HEX,Bin文件 1.1 生成Motorola S-record(s19,srec…)文件 1.2 生成Intel HEX文件 1.3 生成Bin文件 2 …

python的Streamlit庫的text_input組件

text_input 常用的輸入組件,這里注意記錄一下具體的參數,方便使用 函數簽名 st.text_input(label, value"", max_charsNone, keyNone, type"default", helpNone, autocompleteNone, on_changeNone, argsNone, kwargsNone, *, pla…

【LeetCode】414. 第三大的數

414. 第三大的數 難度:簡單 題目 給你一個非空數組,返回此數組中 第三大的數 。如果不存在,則返回數組中最大的數。 示例 1: 輸入:[3, 2, 1] 輸出:1 解釋:第三大的數是 1 。示例 2&#xf…

計算機服務器中了mkp勒索病毒怎么辦,mkp勒索病毒解密數據恢復

網絡技術的不斷發展,也為網絡安全帶來了威脅,近期云天數據恢復中心的工程師陸續接到很多企業的求助,在本月,很多企業的計算機服務器遭到了mkp勒索病毒攻擊,導致企業計算機系統癱瘓,無法正常工作&#xff0c…

vue生命周期和路由

Vue.js 生命周期是Vue.js實例從創建到銷毀的整個過程中所經過的一系列事件,可以理解為Vue.js的生命周期鉤子函數。在這些生命周期鉤子函數中,你可以添加自定義的邏輯代碼,以便在組件生命周期的不同階段進行不同的操作。Vue.js生命周期共分為八…

Linux的ps簡單實現

原理&#xff1a;遍歷下的/proc/%s/task/%s/status所有文件&#xff0c;兩個%s都為pid號。 注&#xff1a;多線程下&#xff0c;只打印一個pid/task下的所有目錄&#xff0c;即可收集各個線程對應的信息。 $ cat ps.c #include <stdio.h> #include <stdlib.h> #in…

《深入理解計算機系統》學習筆記 - 第四課 - 機器級別的程序

Lecture 05 Machine Level Programming I Basics 機器級別的程序 文章目錄 Lecture 05 Machine Level Programming I Basics 機器級別的程序intel 處理器的歷史和體系結構芯片的構成AMD 公司(Advanced Micro Devices&#xff0c;先進的微型設備) C, 匯編, 機器代碼定義匯編/機器…

2024美賽備戰1--數據處理(數據預處理,異常值處理,預測模型,插值擬合 *****必看****)

1.數據預處理 所謂數據預處理&#xff0c;就是指在正式做題之前對數據進行的一些處理。在有些情 況下&#xff0c;出題方提供的數據或者網上查找的數據并不能直接使用&#xff0c;比如缺少數據甚 至是異常數據&#xff0c;如果直接忽略缺失值&#xff0c;或者沒發現異常數據&am…

angular material mat-error 失效不展示

1.你命名了控制mat-error顯示與否的變量&#xff0c;卻沒有在html里使用 2.mat-error是放在mat-form-field里才生效的&#xff0c;如果 <input matInput required formControlName"phoneNumber" /> 中的phoneNumber其實是valid&#xff0c;通過驗證的&#x…

【KALI】設置靜態IP地址

ip: 192.168.1.10/24 網關&#xff1a;192.168.1.1 DNS&#xff1a;192.168.1.254/etc/network/interfaces原始文件內容為&#xff1a; # This file describes the network interfaces available on your system # and how to activate them. For more information, see inter…