国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JavaEE】線程安全的集合類

這篇具有很好參考價(jià)值的文章主要介紹了【JavaEE】線程安全的集合類。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作者主頁:paper jie_博客

本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。

本文于《JavaEE》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。

其他專欄:《MySQL》《C語言》《javaSE》《數(shù)據(jù)結(jié)構(gòu)》等

內(nèi)容分享:本期將會(huì)分享線程安全的集合類芝士

目錄

引入

多線程使用ArrayList

多線程使用隊(duì)列

多線程使用哈希表

Hashtable

ConcurrentHashMap

?相關(guān)面試題


引入

之前我們所學(xué)的集合類,大多數(shù)都是線程不安全的.,像ArrayList,LinkedList,Queue等都是線程不安全的.這里我們將介紹`線程安全的類

多線程使用ArrayList

1.可以自己使用synchronized來加鎖實(shí)現(xiàn)線程安全

2.Collections.synchronizedList(new ArrayList);

它就相當(dāng)于給ArrayList套了一個(gè)殼,通過這個(gè)殼得到了一個(gè)新的對(duì)象,這個(gè)新的對(duì)象的關(guān)鍵方法就加上了synchronized.

3.使用CopyOnWritArrayList

當(dāng)我們放容器中添加元素時(shí),不會(huì)往舊容器中添加,而是會(huì)將當(dāng)前這個(gè)容器的數(shù)據(jù)拷貝到一個(gè)新的容器中.添加完元素后,在將原有容器的引用指向新的容器.

它帶來的好處就是我們可以對(duì)CopyWritArrayList容器進(jìn)行并發(fā)的讀,不需要加鎖,因?yàn)楫?dāng)前容器不會(huì)添加任何元素.

優(yōu)點(diǎn)就是在讀多寫少的場(chǎng)景下,性能很高,不需要加鎖.

缺點(diǎn)就是比較占用內(nèi)存,新寫的數(shù)據(jù)不能第一時(shí)間讀到.且不適用與寫多的場(chǎng)景.

多線程使用隊(duì)列

1.ArrayListBlockingQueue

2.LinkedListBlockingQue

3.priorityBlockingQueue

4.TransferQueue

只包含一個(gè)元素的阻塞隊(duì)列.

多線程使用哈希表

Hashtable

在數(shù)據(jù)結(jié)構(gòu)中,我們學(xué)過hashmap和hashset,這兩者本身其實(shí)是線程不安全的.在所線程的環(huán)境下我們就可以使用Hashable和CouncurrentHashMap.

而我們的Hashtable就是在關(guān)鍵方法中加上了synchronized關(guān)鍵字,這其實(shí)就是直接對(duì)Hashtable對(duì)象本身直接加鎖.這就會(huì)出現(xiàn)一些問題:

如果多個(gè)線程訪問同一個(gè)Hashtable就會(huì)造成鎖沖突.

size屬性也是被synchronized控制,這樣鎖沖突會(huì)進(jìn)一步加大.

一但觸發(fā)擴(kuò)容,就會(huì)由該線程來完成擴(kuò)容過程,這個(gè)過程機(jī)會(huì)涉及到大量的元素拷貝,這里的速度就會(huì)很慢.

一個(gè)Hashtable就只有一個(gè)鎖,只要有兩個(gè)線程訪問這個(gè)HashTable中的任意一個(gè)數(shù)據(jù)就會(huì)發(fā)生鎖競(jìng)爭(zhēng).這里讀操作和其他鏈表的元素是不會(huì)發(fā)生線程安全問題的,但是這里還是會(huì)有鎖.

【JavaEE】線程安全的集合類,JAVA,# JavaEE,java,開發(fā)語言

ConcurrentHashMap

相比于Hashtable,ConcurrentHashMap就做出了一系列的改進(jìn)和優(yōu)化.這里以Java1.8為例:

1. 讀操作沒有加鎖,只是使用了volatile保證從內(nèi)存讀取結(jié)果,只對(duì)寫操作進(jìn)行加鎖.加鎖的方式仍然是使用synchronized,只不過它加鎖的不是整個(gè)對(duì)象,而是"鎖桶",這就是每一個(gè)鏈表,這里用每個(gè)鏈表的頭節(jié)點(diǎn)來作為鎖對(duì)象,這樣就大大降低了鎖沖突的概率.

2. 充分的利用了CAS特性.size屬性就是使用CAS來更新的,這樣就又降低了鎖沖突的概率.

3. 優(yōu)化了擴(kuò)容方法,采用的是化整為零.

發(fā)現(xiàn)需要擴(kuò)容的線程,只需要?jiǎng)?chuàng)建出一個(gè)數(shù)組,再搬運(yùn)少量元素過去即可.

擴(kuò)容期間,新老數(shù)組同時(shí)存在

后面每個(gè)操作ConcurrentMap的線程都會(huì)參與搬運(yùn)數(shù)組的任務(wù),每個(gè)操作都會(huì)搬運(yùn)一小部分

直到搬運(yùn)完最后一個(gè)元素再將老數(shù)組刪除.

這個(gè)期間插入元素只往新數(shù)組中插入.

這個(gè)期間查找刪除元素新數(shù)組和老數(shù)組都需要查找和刪除.

【JavaEE】線程安全的集合類,JAVA,# JavaEE,java,開發(fā)語言

?相關(guān)面試題

1. ConcurrentHashMap的讀是否要加鎖?

讀不需要加鎖,這樣可以減少鎖沖突.但是為了及時(shí)讀到剛修改的數(shù)據(jù),搭配了volatile關(guān)鍵字.

2. 介紹ConcurrentHashMap的分段技術(shù)?

這是Java1.7中采用的技術(shù).Java1.8中已經(jīng)不再使用了.它就是將若干個(gè)鏈表分成一個(gè)段,給段加上鎖,目的還是為了降低鎖競(jìng)爭(zhēng)的概率.當(dāng)兩個(gè)線程訪問的數(shù)據(jù)在一個(gè)段中就會(huì)發(fā)生鎖競(jìng)爭(zhēng).?

3.ConcurrentHashMap在jdk1.8做了哪些優(yōu)化?

取消了分段鎖,直接給每個(gè)哈希桶每個(gè)鏈表分配了一個(gè)鎖.將原來數(shù)組+鏈表的實(shí)現(xiàn)方式改變?yōu)閿?shù)組+鏈表+紅黑樹的方式.當(dāng)鏈表大于等于8時(shí)就會(huì)由鏈表轉(zhuǎn)變?yōu)榧t黑樹.?

4.Hashtable和HashMap,ConcurrentHashMap的區(qū)別?

HashMap: 線程不安全,key可以為null

Hashtable: 線程安全,使用synchronized鎖加在Hashtable對(duì)象上,效率低.且key不可以為null

ConcurrentHashMap: 線程安全,使用synchronized鎖加在每個(gè)鏈表上,鎖沖突率低,充分利用CAS機(jī)制,優(yōu)化了擴(kuò)容方式,key不能為null.文章來源地址http://www.zghlxwxcb.cn/news/detail-809412.html

到了這里,關(guān)于【JavaEE】線程安全的集合類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 從零學(xué)Java 線程安全的集合

    從零學(xué)Java 線程安全的集合

    Collection體系集合、以及線程安全集合。 注:下劃線代表線程安全集合 Collections中的工具方法 Collections工具類中提供了多個(gè)可以獲得線程安全集合的方法。 public static Collection synchronizedCollection(Collection c) public static List synchronizedList(List list) public static Set synchronizedSet(Set s) public

    2024年01月17日
    瀏覽(16)
  • Java 8并發(fā)集合:安全高效的多線程集合

    Java 8并發(fā)集合:安全高效的多線程集合

    在多線程環(huán)境中,使用線程安全的數(shù)據(jù)結(jié)構(gòu)非常重要,以避免競(jìng)態(tài)條件和數(shù)據(jù)不一致的問題。Java 8引入了一些并發(fā)集合類,提供了安全高效的多線程集合操作。本教程將介紹Java 8中的并發(fā)集合類,包括ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentSkipListSet和CopyOnWriteArrayList。 Conc

    2024年02月04日
    瀏覽(25)
  • 【JAVA】哪些集合類是線程安全的

    【JAVA】哪些集合類是線程安全的

    ?? 個(gè)人博客: 個(gè)人主頁 ?? 個(gè)人專欄: JAVA ???? 功不唐捐,玉汝于成 目錄 前言 正文 Vector: HashTable: Collections.synchronizedList()、Collections.synchronizedSet()、Collections.synchronizedMap(): 4.ConcurrentHashMap: 5.CopyOnWriteArrayList 和 CopyOnWriteArraySet: 結(jié)語 ?我的其他博客 在多線程編程中

    2024年01月25日
    瀏覽(32)
  • javaEE初階——多線程(九)——JUC常見的類以及線程安全的集合類

    javaEE初階——多線程(九)——JUC常見的類以及線程安全的集合類

    T04BF ??專欄: 算法|JAVA|MySQL|C語言 ?? 小比特 大夢(mèng)想 此篇文章與大家分享多線程專題的最后一篇文章:關(guān)于JUC常見的類以及線程安全的集合類 如果有不足的或者錯(cuò)誤的請(qǐng)您指出! 3.1Callable接口 Callable和Runnable一樣,都是用來描述一個(gè)任務(wù)的 但是區(qū)別在于 ,用Callable描述的任務(wù)是有

    2024年04月25日
    瀏覽(22)
  • JAVA數(shù)據(jù)結(jié)構(gòu)篇--13線程安全的Set 集合

    前言:java 中用于存放不重復(fù)元素的set 集合,其中無序的HashSet,以及有序的LinkedHashSet和TreeSet 都是非線程安全的,那么多線程環(huán)境下,我們要存放不重復(fù)的元素,需要使用哪種集合進(jìn)行數(shù)據(jù)存??; 1 使用: 2 過程: 2.1 放入獲取元素: Collections.synchronizedSet:通過使用synchron

    2024年02月16日
    瀏覽(21)
  • Java - JUC(java.util.concurrent)包詳解,其下的鎖、安全集合類、線程池相關(guān)、線程創(chuàng)建相關(guān)和線程輔助類、阻塞隊(duì)列

    Java - JUC(java.util.concurrent)包詳解,其下的鎖、安全集合類、線程池相關(guān)、線程創(chuàng)建相關(guān)和線程輔助類、阻塞隊(duì)列

    JUC是java.util.concurrent包的簡(jiǎn)稱,在Java5.0添加,目的就是為了更好的支持高并發(fā)任務(wù)。讓開發(fā)者進(jìn)行多線程編程時(shí)減少競(jìng)爭(zhēng)條件和死鎖的問題 java.lang.Thread.State tools(工具類):又叫信號(hào)量三組工具類,包含有 CountDownLatch(閉鎖) 是一個(gè)同步輔助類,在完成一組正在其他線程中

    2024年02月05日
    瀏覽(22)
  • JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊(duì)列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)

    JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊(duì)列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點(diǎn)贊??收藏?評(píng)論? ? 文章目錄 ? ? ? ? 1.0 線程安全的集合類 ? ? ? ? 1.2?線程安全的集合類 - Vector ? ? ? ? 1.3 線程安全的集合類 - Stack ? ? ? ? 1.4 線程安全的集合類 - HashTable ? ? ? ? 2.0 多線程環(huán)境使用 ArrayList ? ? ? ?

    2024年04月25日
    瀏覽(59)
  • 碼出高效:Java開發(fā)手冊(cè)筆記(線程安全)

    碼出高效:Java開發(fā)手冊(cè)筆記(線程安全)

    ????并發(fā)與并行的目標(biāo)都是盡可能快地執(zhí)行完所有任務(wù)。以醫(yī)生坐診為例,某個(gè)科室有兩個(gè)專家同時(shí)出診,這就是兩個(gè)并行任務(wù),其中一個(gè)醫(yī)生,時(shí)而問診,時(shí)而查看化驗(yàn)單,然后繼續(xù)問診,突然又中斷去處理病人的咨詢,這就是并發(fā)。在并發(fā)環(huán)境下,由于程序的封閉性全

    2024年02月08日
    瀏覽(18)
  • JavaEE初階:Java線程的狀態(tài)

    JavaEE初階:Java線程的狀態(tài)

    目錄 獲取當(dāng)前線程引用 休眠當(dāng)前線程 ?線程的狀態(tài) 1.NEW? ? ? ? ? ?? ? 2.TERMINATED? 3.RUNNABLE 4.WAITING 5.TIMED_WAITING 6.BLOCKED 多線程的意義 單線程 ?多線程 這個(gè)方法返回當(dāng)前線程的引用。但是我們會(huì)對(duì)static有疑惑,這其實(shí)是一個(gè)靜態(tài)方法,更好的說法是這是一個(gè) 類方法, 調(diào)用這

    2024年02月11日
    瀏覽(24)
  • 【JavaEE】Java中的多線程 (Thread類)

    【JavaEE】Java中的多線程 (Thread類)

    作者主頁: paper jie_博客 本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于《JavaEE》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。 其他專欄:《MySQL》《

    2024年02月05日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包