日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

發(fā)布時(shí)間:2024/7/5 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前談過高并發(fā)編程系列:

高并發(fā)編程系列:4種常用Java線程鎖的特點(diǎn),性能比較、使用場景

高并發(fā)編程系列:CountDownLatch、Semaphore等4大并發(fā)工具類詳解?

高并發(fā)編程系列:4大JVM性能分析工具詳解,及內(nèi)存泄漏分析方案

高并發(fā)編程系列:ConcurrentHashMap的實(shí)現(xiàn)原理(JDK1.7和JDK1.8)

Java并發(fā)編程系列:深入詳解Synchronized同步鎖的底層實(shí)現(xiàn)

今天詳細(xì)介紹并發(fā)容器的實(shí)現(xiàn)原理,與同步容器的區(qū)別等。

并發(fā)容器的由來

在Java并發(fā)編程中,經(jīng)常聽到Java集合類,同步容器、并發(fā)容器,那么他們有哪些具體分類,以及各自之間的區(qū)別和優(yōu)劣呢?

只有把這些梳理清楚了,你才能真正掌握在高并發(fā)的環(huán)境下,正確使用好并發(fā)容器,我們先從Java集合類,同步容器談起。

1.什么是同步容器

Java的集合容器框架中,主要有四大類別:List、Set、Queue、Map,大家熟知的這些集合類ArrayList、LinkedList、HashMap這些容器都是非線程安全的。

如果有多個(gè)線程并發(fā)地訪問這些容器時(shí),就會(huì)出現(xiàn)問題。因此,在編寫程序時(shí),在多線程環(huán)境下必須要求程序員手動(dòng)地在任何訪問到這些容器的地方進(jìn)行同步處理,這樣導(dǎo)致在使用這些容器的時(shí)候非常地不方便。

所以,Java先提供了同步容器供用戶使用。

同步容器可以簡單地理解為通過synchronized來實(shí)現(xiàn)同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。


2.同步容器,主要的分類

  • Vector
  • Stack
  • HashTable
  • Collections.synchronized方法生成

同步容器面臨的問題

可以通過查看Vector,Hashtable等這些同步容器的實(shí)現(xiàn)代碼,可以看到這些容器實(shí)現(xiàn)線程安全的方式就是將它們的狀態(tài)封裝起來,并在需要同步的方法上加上關(guān)鍵字synchronized。

這樣做的代價(jià)是削弱了并發(fā)性,當(dāng)多個(gè)線程共同競爭容器級的鎖時(shí),吞吐量就會(huì)降低。

例如: HashTable只要有一條線程獲取了容器的鎖之后,其他所有的線程訪問同步函數(shù)都會(huì)被阻塞,因此同一時(shí)刻只能有一條線程訪問同步函數(shù)。


因此為了解決同步容器的性能問題,所以才有了并發(fā)容器。

什么是并發(fā)容器

java.util.concurrent包中提供了多種并發(fā)類容器。

并發(fā)類容器是專門針對多線程并發(fā)設(shè)計(jì)的,使用了鎖分段技術(shù),只對操作的位置進(jìn)行同步操作,但是其他沒有操作的位置其他線程仍然可以訪問,提高了程序的吞吐量。

采用了CAS算法和部分代碼使用synchronized鎖保證線程安全。

并發(fā)容器有哪些分類

1.ConcurrentHashMap

對應(yīng)的非并發(fā)容器:HashMap

目標(biāo):代替Hashtable、synchronizedMap,支持復(fù)合操作

原理:JDK6中采用一種更加細(xì)粒度的加鎖機(jī)制Segment“分段鎖”,JDK8中采用CAS無鎖算法。

2.CopyOnWriteArrayList

對應(yīng)的非并發(fā)容器:ArrayList

目標(biāo):代替Vector、synchronizedList

原理:利用高并發(fā)往往是讀多寫少的特性,對讀操作不加鎖,對寫操作,先復(fù)制一份新的集合,在新的集合上面修改,然后將新集合賦值給舊的引用,并通過volatile 保證其可見性,當(dāng)然寫操作的鎖是必不可少的了。

3.CopyOnWriteArraySet

對應(yīng)的非并發(fā)容器:HashSet

目標(biāo):代替synchronizedSet

原理:基于CopyOnWriteArrayList實(shí)現(xiàn),其唯一的不同是在add時(shí)調(diào)用的是CopyOnWriteArrayList的addIfAbsent方法,其遍歷當(dāng)前Object數(shù)組,如Object數(shù)組中已有了當(dāng)前元素,則直接返回,如果沒有則放入Object數(shù)組的尾部,并返回。

4.ConcurrentSkipListMap

對應(yīng)的非并發(fā)容器:TreeMap

目標(biāo):代替synchronizedSortedMap(TreeMap)

原理:Skip list(跳表)是一種可以代替平衡樹的數(shù)據(jù)結(jié)構(gòu),默認(rèn)是按照Key值升序的。

5.ConcurrentSkipListSet

對應(yīng)的非并發(fā)容器:TreeSet

目標(biāo):代替synchronizedSortedSet

原理:內(nèi)部基于ConcurrentSkipListMap實(shí)現(xiàn)

6.ConcurrentLinkedQueue

不會(huì)阻塞的隊(duì)列

對應(yīng)的非并發(fā)容器:Queue

原理:基于鏈表實(shí)現(xiàn)的FIFO隊(duì)列(LinkedList的并發(fā)版本)

7.LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue

對應(yīng)的非并發(fā)容器:BlockingQueue

特點(diǎn):拓展了Queue,增加了可阻塞的插入和獲取等操作

原理:通過ReentrantLock實(shí)現(xiàn)線程安全,通過Condition實(shí)現(xiàn)阻塞和喚醒

實(shí)現(xiàn)類:

  • LinkedBlockingQueue:基于鏈表實(shí)現(xiàn)的可阻塞的FIFO隊(duì)列
  • ArrayBlockingQueue:基于數(shù)組實(shí)現(xiàn)的可阻塞的FIFO隊(duì)列
  • PriorityBlockingQueue:按優(yōu)先級排序的隊(duì)列

ConcurrentHashMap的實(shí)現(xiàn)

HashMap,Hashtable與ConcurrentHashMap都是實(shí)現(xiàn)的哈希表數(shù)據(jù)結(jié)構(gòu),在隨機(jī)讀取的時(shí)候效率很高。

Hashtable實(shí)現(xiàn)同步是利用synchronized關(guān)鍵字進(jìn)行鎖定的,其是針對整張哈希表進(jìn)行鎖定的,即每次鎖住整張表讓線程獨(dú)占,在線程安全的背后是巨大的浪費(fèi)。

ConcurrentHashMap和Hashtable主要區(qū)別就是圍繞著鎖的粒度進(jìn)行區(qū)別以及如何區(qū)鎖定。

上圖中,左邊是Hashtable的實(shí)現(xiàn)方式,可以看到鎖住整個(gè)哈希表;而右邊則是ConcurrentHashMap的實(shí)現(xiàn)方式,單獨(dú)鎖住每一個(gè)桶(segment).ConcurrentHashMap將哈希表分為16個(gè)桶(默認(rèn)值),諸如get(),put(),remove()等常用操作只鎖當(dāng)前需要用到的桶,而size()才鎖定整張表。

原來只能一個(gè)線程進(jìn)入,現(xiàn)在卻能同時(shí)接受16個(gè)寫線程并發(fā)進(jìn)入(寫線程需要鎖定,而讀線程幾乎不受限制)。

所以,才有了并發(fā)性的極大提升。


高并發(fā)編程,除了并發(fā)容器,還會(huì)涉及到并發(fā)工具類:CountDownLatch等,后續(xù)將詳細(xì)的介紹并發(fā)工具類,以及ConcurrentHashMap的底層實(shí)現(xiàn)細(xì)節(jié),不僅要知其然,還要知其所以然,這樣才能更好的掌握好高并發(fā)編程。

你可能也喜歡:

  • Java多線程系列(三):Java線程池的使用方式,及核心運(yùn)行原理
  • Java多線程系列(四):4種常用Java線程鎖的特點(diǎn),性能比較、使用場景
  • Java多線程系列(八):ConcurrentHashMap的實(shí)現(xiàn)原理(JDK1.7和JDK1.8)
  • Java多線程系列(一):最全面的Java多線程學(xué)習(xí)概述
  • Java多線程系列(六):深入詳解Synchronized同步鎖的底層實(shí)現(xiàn)
  • Java多線程系列(十):源碼剖析AQS的實(shí)現(xiàn)原理

  • 總結(jié)

    以上是生活随笔為你收集整理的Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。