多線程(進階四:線程安全的集合類)

目錄

一、多線程環境使用ArrayList

二、多線程環境使用隊列

三、多線程環境使用哈希表

1、HashMap

2、Hashtable

3、ConcurrentHashMap

(1)縮小了鎖的粒度

(2)充分使用了CAS原子操作,減少一些加鎖

(3)針對擴容操作的一些優化(化整為零)

四、相關面試題


大部分集合類都是線程不安全的,Vector,Stack,Hashtable是線程安全的,但不建議使用,因為無論什么情況都要加鎖,甚至單線程也是,這樣就很不合理;并且這幾個集合類官方已經不推薦使用了,可能在未來的版本中就被刪掉了。

下面介紹一些線程不安全的集合類。

一、多線程環境使用ArrayList

1、自己使用同步機制(synchronized或者ReentrantLock)

2、Collections.synchronizedList(new ArrayList);

? ? ? ? 相當于給ArrayList套了個殼,ArrayList各種操作本身是不帶鎖的,通過上述操作套殼后,得到了新的對象,新的對象里面的關鍵方法都是帶有鎖的。

3、使用CopyOnWriteArrayList

????????CopyOnWrite容器即寫時復制的容器,多線程對這個順序表進行讀操作時,不會有線程安全問題,但是當多線程進行寫操作時,就會有線程安全問題,CopyOnWriteArrayList會復制一份原來的順序表,并且修改新的順序表內容,再把原來的引用指向新的順序表(此操作是原子的,不需要加鎖)。


二、多線程環境使用隊列

1、自己加鎖

2、使用BlockingQueue

1. ArrayBlockingQueue
基于數組實現的阻塞隊列
2. LinkedBlockingQueue
基于鏈表實現的阻塞隊列
3. PriorityBlockingQueue
基于堆實現的帶優先級的阻塞隊列
4. TransferQueue
最多只包含?個元素的阻塞隊列


三、多線程環境使用哈希表

1、HashMap

? ? ? ? HashMap本身就是線程不安全的。

2、Hashtable

? ? ? ? 在一些關鍵方法上加了鎖

? ? ? ? 這也相當于對this加了鎖,也就是針對Hashtable對象本身加鎖,如果嘗試修改Hash表中兩個不同Hash值里的鏈表,會發生鎖沖突。如圖:

3、ConcurrentHashMap

相對于Hashtable,進行了些優化。

(1)縮小了鎖的粒度

????????多線程如果修改Hash表里Hash值不同的鏈表都發生鎖沖突,是不合理的,而且鎖沖突是很耗時的,所以ConcurrentHashMap是對Hash表里每個鏈表都進行加鎖,這樣,不同的鏈表有不同的鎖對象,多線程修改兩個不同的鏈表,就不會發生鎖沖突了,如圖:

注意:更多的鎖并不意味著要耗費更多的空間,因為在java中的任何對象都可以作為鎖對象,而本身Hash表中就得有數組,數組元素都已經存在,即鏈表的頭結點,每個鏈表都有一個頭結點,可以直接把這個頭結點作為鏈表的鎖對象。

(2)充分使用了CAS原子操作,減少一些加鎖

? ? ? ? 比如,針對Hash表元素個數的維護。

(3)針對擴容操作的一些優化(化整為零)

? ? ? ? 負載因子:描述了每個桶(Hash表)平均有多少個元素;公式:實際個數 / 數組長度(桶的個數)。0.75是默認的擴容閾值(也可以是其他數字值),如果我們算出的負載因子超過規定的擴容閾值,Hash表就會進行擴容。

? ? ? ? 進行擴容時,如果不是concurrentHashMap,會創建一個更大是數組,把舊的數組元素搬運到新的數組中,一次性的全部搬運完,如果Hash表本身的元素就非常多,這里擴容就會非常耗時,但可能過一會兒就又好了,存在不穩定因素,我們無法控制Hash表何時觸發擴容。

? ? ? ? concurrentHashMap則不是一次性的全部搬運完,而是把Hash表中的元素分為若干次搬運完,而不是直接一次性梭哈完,假設Hash表有1kw個元素,每次就只搬運5k哥元素,一共花費2k次搬運完成(搬運的時間會更長一些),但能確保每次搬運消耗的時間不會很長,避免出現很卡的情況。

總的來說,擴容是一個低頻的操作(前提把擴容閾值設置合理),運行整個程序,可能一天都不會觸發擴容,觸發了每次可能會花費幾分鐘的時間進行搬運。

注意:在擴容過程中,存在兩份Hash表,一份是新的,一份是舊的。

? ? ? ? 進行插入操作,直接往新的Hash表上插入。

? ? ? ? 進行刪除操作,新的舊的都要刪除。

? ? ? ? 進行查找操作,新的舊的都要查找。


四、相關面試題

1.ConcurrentHashMap的讀是否要加鎖,為什么?

?讀操作沒有加鎖.目的是為了進一步降低鎖沖突的概率.為了保證讀到剛修改的數據,搭配了volatile關鍵字.

2.介紹下ConcurrentHashMap的鎖分段技術?

這個是Java1.7所采取的技術.Java1.8中已經不再使用了.簡單的說就是把若干個哈希桶分成一個"段"(Segment),針對每個段分別加鎖.

目的也是為了降低鎖沖突的概率.當兩個線程訪問的數據恰好在同一個段上時,才會觸發鎖競爭

3.ConcurrentHashMap在jdk1.8做了哪些優化?

取消了分段鎖,直接給每個哈希桶(每個鏈表)分配了一個鎖(就是以每個鏈表的頭節點對象作為鎖對象).

將原來的數組 + 鏈表的實現方式改進成 數組 + 鏈表 /紅黑樹的方式.當鏈表較長的時候(大于等于8個元素)就轉換成紅黑樹.?

4.HashMap和HashTable,ConcurrentHashMap之間的區別?

HashMap: 線程不安全.key允許為null

HashTable:線程安全.使用synchronized鎖HashTable對象,效率較低.key不允許設置為null.

ConcurrentHashMap: 線程安全.使用synchronized鎖每個鏈表的頭節點,鎖沖突概率較低,充分利用CAS機制,優化了擴容方式.key不允許為null.?


都看到這了,點個贊再走吧,謝謝謝謝謝

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

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

相關文章

maven 項目的創建入門

拓展閱讀 maven 包管理平臺-01-maven 入門介紹 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的詳細對比表格 maven 包管理平臺-02-windows 安裝配置 mac 安裝配置 maven 包管理平臺-03-maven project maven 項目的創建入門 maven 包管理平臺-04-maven archetype 項目原型 ma…

藍橋杯Python B組練習——python復習2

藍橋杯Python B組練習——python復習2 一、簡介 復習python,參考書《Python編程從入門到實踐》,[美]Eric Mathes著。前一部分見專欄——藍橋杯Python B組練習 這一部分不全,不想寫了 二、字典 1.一個簡單的字典 來看一個游戲&#xff0…

LeetCode -55 跳躍游戲

LeetCode -55 跳躍游戲 給你一個非負整數數組 nums ,你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標,如果可以,返回 true ;否則,返回 false 。…

模擬服務器響應的測試框架:moco

第1章:引言 大家好,我是小黑,在這篇博客中,咱們要聊聊Moco測試框架。這個框架,可不是一般的小伙伴,它在模擬服務器響應這塊兒,可是有不少看家本領。 首先,Moco是啥呢?簡…

stable diffusion webUI之賽博菩薩【秋葉】——工具包新手安裝與使用教程

stable diffusion webUI之賽博菩薩【秋葉】——工具包新手安裝與使用教程 AI浪潮襲來,還是學習學習為妙賽博菩薩【秋葉】簡介——(葉ye,四聲,同葉)A繪世啟動器.exe(sd-webui-aki-v4.6.x)工具包安…

【面試題解析--Java基礎】回顧與加深,淺淺回顧JAVA常規八股,利用起碎片化時間。

一、Java基礎 1. final 關鍵字的作用: 修飾類時,被修飾的類無法被繼承。修飾方法時,被修飾的方法無法被重寫。修飾變量時,變量為常量,初始化后無法重新賦值。 2. static 關鍵字的作用: 修飾變量和方法時…

住房貸款利息退稅筆記

應該繳稅了才能退稅,如果是學生,沒有繳稅應該是無法退稅的。 產權證明 如果是商品房,沒有取得房產證,那就是房屋預售合同 扣除年度 應選擇上一年 扣除比例 沒有結婚,選否 申報方式

unity 數學 如何計算線和平面的交點

已知一個平面上的一點P0和法向量n,一條直線上的點L0和方向L,求該直線與該平面的交點P 如下圖 首先我們要知道向量歸一化點乘之后得到就是兩個向量的夾角的余弦值,如果兩個向量相互垂直則值是0,小于0則兩個向量的夾角大于90度,大于…

(C語言)函數詳解上

(C語言)函數詳解上 目錄: 1. 函數的概念 2. 庫函數 2.1 標準庫和頭文件 2.2 庫函數的使用方法 2.2.1 sqrt 功能 2.2.2 頭文件包含 2.2.3 實踐 2.2.4 庫函數文檔的一般格式 3. 自定義函數 3.1 函數的語法形式 3.2 函數的舉例 4. 形參和實參 4.…

MySQL-CDC 新增同步表確無法捕獲增量問題處理

Flink-CDC版本&#xff1a;2.3.0 問題描述 之前通過Flink-CDC捕獲Mysql數據庫的數據變更情況&#xff0c;代碼大致如下&#xff1a; StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(flinkEnvConf);MySqlSource<String> mysql …

Redis--事務機制的詳解及應用

Redis事務的概念&#xff1a; Redis事務就是將一系列命令包裝成一個隊列&#xff0c;在執行時候按照添加的順序依次執行&#xff0c;中間不會被打斷或者干擾&#xff0c;在執行事務中&#xff0c;其他客戶端提交的命令不可以插入到執行事務的隊列中&#xff0c;簡單來說Redis事…

【Linux】進程優先級以及Linux內核進程調度隊列的簡要介紹

進程優先級 基本概念查看系統進程修改進程的優先級Linux2.6內核進程調度隊列的簡要介紹和進程優先級有關的概念進程切換 基本概念 為什么會存在進程優先級&#xff1f; ??進程優先級用于確定在資源競爭的情況下&#xff0c;哪個進程將被操作系統調度為下一個運行的進程。進程…

SSH教程

ssh 是遠程連接的利器, 可以說凡是涉及到 linux 服務器, ssh 就是一個繞不開的話題. 本文作為一個教程, 盡可能詳細的幫助讀者設置 ssh, 并給出一些常用的 ssh 配置方法 (主要用于 linux 系統的遠程登錄和文件傳輸). 1. 簡介 ssh 分為兩個部分, sshd 服務端和 ssh 客戶端. ssh…

黑馬鴻蒙學習筆記1:TEXT組件

業余時間學習下黑馬鴻蒙課程&#xff0c;主要截取重要的PPT學習&#xff1a; 其實就是用$r&#xff08;&#xff09;的方法&#xff0c;去調用本地化資源文件&#xff0c;可以做多語言了。 比如每個語言目錄下都有個string.json文件&#xff0c;然后用鍵值對name,value的方式搭…

JVM 補充——StringTable

具體哪些String是相等的&#xff0c;各種String的情況&#xff0c;看這個&#xff1a; https://javaguide.cn/java/basis/java-basic-questions-02.html#string-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%8F%98%E7%9A%84 String的基本特性 String&#xf…

[算法沉淀記錄] 分治法應用 —— 二分搜索(Binary Search)

分治法應用 —— 二分搜索 算法基本思想 二分搜索&#xff08;Binary Search&#xff09;是一種在有序數組中查找特定元素的高效算法。它每次將搜索區間減半&#xff0c;從而快速地縮小搜索范圍。二分搜索的基本思想是&#xff1a;首先將待查關鍵字與數組中間位置的關鍵字比較…

【C++】STL簡介 | STL六大組件 | string類 | string類對象操作

目錄 1. 什么是STL 2. STL的版本 3. STL的六大組件 4. STL的缺陷 5. 引出string類 6. 標準庫中的string類 6.1 string類簡介 6.2 string類對象的構造 6.3. string類對象的容量 6.4. string類對象的遍歷 6.5. string類對象的修改 6.6. string類非成員函數 6.7. vs…

使用濾鏡屬性將網頁從彩色變黑白

在某些情況下&#xff0c;例如為了表達哀悼或紀念&#xff0c; 許多網站會將頁面顏色從彩色調整為黑白灰色。我到網上查找答案&#xff0c;發現有些是通過javascript或jQuery實現的&#xff0c;我試了一下居然無效。 后來找到一個方法&#xff0c;是僅用一行CSS代碼就能搞定的&…

基于CNN-LSTM-Attention的時間序列回歸預測matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1卷積神經網絡&#xff08;CNN&#xff09;在時間序列中的應用 4.2 長短時記憶網絡&#xff08;LSTM&#xff09;處理序列依賴關系 4.3 注意力機制&#xff08;Attention&#xff09; 5…

MySQL 學習記錄 2

原文&#xff1a;https://blog.iyatt.com/?p13818 13 存儲引擎 查看一下前面創建的一張表的創建語句&#xff0c;當時并沒有顯式指定引擎&#xff0c;MySQL 自動指定的 InnoDB&#xff0c;即默認引擎是這個。 創建表的時候要顯式指定引擎可以參考這個語句 查看當前 MySQL …