国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ConcurrentHashMap基于JDK1.8源碼剖析

sanyang / 2189人閱讀

摘要:下面我來簡(jiǎn)單總結(jié)一下的核心要點(diǎn)底層結(jié)構(gòu)是散列表數(shù)組鏈表紅黑樹,這一點(diǎn)和是一樣的。是將所有的方法進(jìn)行同步,效率低下。而作為一個(gè)高并發(fā)的容器,它是通過部分鎖定算法來進(jìn)行實(shí)現(xiàn)線程安全的。

前言
聲明,本文用的是jdk1.8

前面章節(jié)回顧:

Collection總覽

List集合就這么簡(jiǎn)單【源碼剖析】

Map集合、散列表、紅黑樹介紹

HashMap就是這么簡(jiǎn)單【源碼剖析】

LinkedHashMap就這么簡(jiǎn)單【源碼剖析】

TreeMap就這么簡(jiǎn)單【源碼剖析】

本篇主要講解ConCurrentHashMap~

看這篇文章之前最好是有點(diǎn)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ):

Java實(shí)現(xiàn)單向鏈表

棧和隊(duì)列就是這么簡(jiǎn)單

二叉樹就這么簡(jiǎn)單

當(dāng)然了,如果講得有錯(cuò)的地方還請(qǐng)大家多多包涵并不吝在評(píng)論去指正~

一、ConCurrentHashMap剖析

ConCurrentHashMap在初學(xué)的時(shí)候反正我是沒有接觸過的,不知道你們接觸過了沒有~

這個(gè)類聽得也挺少的,在集合中是比較復(fù)雜的一個(gè)類了,它涉及到了一些多線程的知識(shí)點(diǎn)。

不了解或忘記多線程知識(shí)點(diǎn)的同學(xué)也不要怕,哪兒用到了多線程的知識(shí)點(diǎn),我都會(huì)簡(jiǎn)單介紹一下,并給出對(duì)應(yīng)的資料去閱讀的~

好了,我們就來開始吧~

1.1初識(shí)ConCurrentHashMap

ConCurrentHashMap的底層是:散列表+紅黑樹,與HashMap是一樣的。

從前面的章節(jié)我們也可以發(fā)現(xiàn):最快了解一下類是干嘛的,我們看源碼的頂部注釋就可以了!

我簡(jiǎn)單翻譯了一下頂部的注釋(我英文水平渣,如果有錯(cuò)的地方請(qǐng)多多包涵~歡迎在評(píng)論區(qū)下指正)

根據(jù)上面注釋我們可以簡(jiǎn)單總結(jié):

JDK1.8底層是散列表+紅黑樹

ConCurrentHashMap支持高并發(fā)的訪問和更新,它是線程安全

檢索操作不用加鎖,get方法是非阻塞的

key和value都不允許為null

1.2JDK1.7底層實(shí)現(xiàn)

上面指明的是JDK1.8底層是:散列表+紅黑樹,也就意味著,JDK1.7的底層跟JDK1.8是不同的~

JDK1.7的底層是:segments+HashEntry數(shù)組:

圖來源:https://blog.csdn.net/panweiw...

Segment繼承了ReentrantLock,每個(gè)片段都有了一個(gè)鎖,叫做“鎖分段

大概了解一下即可~

1.3有了Hashtable為啥需要ConCurrentHashMap

Hashtable是在每個(gè)方法上都加上了Synchronized完成同步,效率低下。

ConcurrentHashMap通過在部分加鎖利用CAS算法來實(shí)現(xiàn)同步。

1.4CAS算法和volatile簡(jiǎn)單介紹

在看ConCurrentHashMap源碼之前,我們來簡(jiǎn)單講講CAS算法和volatile關(guān)鍵字

CAS(比較與交換,Compare and swap) 是一種有名的無鎖算法

CAS有3個(gè)操作數(shù)

內(nèi)存值V

舊的預(yù)期值A(chǔ)

要修改的新值B

當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做

當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí),只有其中一個(gè)線程能更新變量的值(A和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B),而其它線程都失敗,失敗的線程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試(否則什么都不做)

看了上面的描述應(yīng)該就很容易理解了,先比較是否相等,如果相等則替換(CAS算法)

參考資料:

CAS優(yōu)秀博文:https://www.cnblogs.com/exceptioneye/p/5373498.html

CAS優(yōu)秀博文:https://www.cnblogs.com/549294286/p/3766717.html

接下來我們看看volatile關(guān)鍵字,在初學(xué)的時(shí)候也很少使用到volatile這個(gè)關(guān)鍵字。反正我沒用到,而又經(jīng)常在看Java相關(guān)面試題的時(shí)候看到它,覺得是一個(gè)挺神秘又很難的一個(gè)關(guān)鍵字。其實(shí)不然,還是挺容易理解的~

volatile經(jīng)典總結(jié):volatile僅僅用來保證該變量對(duì)所有線程的可見性,但不保證原子性

我們將其拆開來解釋一下:

保證該變量對(duì)所有線程的可見性

在多線程的環(huán)境下:當(dāng)這個(gè)變量修改時(shí),所有的線程都會(huì)知道該變量被修改了,也就是所謂的“可見性”

不保證原子性

修改變量(賦值)實(shí)質(zhì)上是在JVM中分了好幾步,而在這幾步內(nèi)(從裝載變量到修改),它是不安全的

如果沒看懂或者想要深入了解其原理和可參考下列博文:

http://www.cnblogs.com/Mainz/p/3556430.html

https://www.cnblogs.com/Mainz/p/3546347.html

http://www.dataguru.cn/java-865024-1-1.html

1.5ConCurrentHashMap域

域?qū)ο笥羞@么幾個(gè):

我們來簡(jiǎn)單看一下他們是什么東東:

初次閱讀完之后,有的屬性我也不太清楚它是干什么的,在繼續(xù)閱讀之后可能就明朗了~

1.6ConCurrentHashMap構(gòu)造方法

ConcurrentHashMap的構(gòu)造方法有5個(gè):

具體的實(shí)現(xiàn)是這樣子的:

可以發(fā)現(xiàn),在構(gòu)造方法中有幾處都調(diào)用了tableSizeFor(),我們來看一下他是干什么的:

點(diǎn)進(jìn)去之后發(fā)現(xiàn),啊,原來我看過這個(gè)方法,在HashMap的時(shí)候.....

它就是用來獲取大于參數(shù)且最接近2的整次冪的數(shù)...

賦值給sizeCtl屬性也就說明了:這是下次擴(kuò)容的大小~

1.7put方法

終于來到了最核心的方法之一:put方法啦~~~~

我們先來整體看一下put方法干了什么事:

接下來,我們來看看初始化散列表的時(shí)候干了什么事:initTable()

只讓一個(gè)線程對(duì)散列表進(jìn)行初始化

1.8get方法

從頂部注釋我們可以讀到,get方法是不用加鎖的,是非阻塞的。

我們可以發(fā)現(xiàn),Node節(jié)點(diǎn)是重寫的,設(shè)置了volatile關(guān)鍵字修飾,致使它每次獲取的都是最新設(shè)置的值

二、總結(jié)

上面簡(jiǎn)單介紹了ConcurrentHashMap的核心知識(shí),還有很多知識(shí)點(diǎn)都沒有提及到,作者的水平也不能將其弄懂~~有興趣進(jìn)入的同學(xué)可到下面的鏈接繼續(xù)學(xué)習(xí)。

下面我來簡(jiǎn)單總結(jié)一下ConcurrentHashMap的核心要點(diǎn):

底層結(jié)構(gòu)是散列表(數(shù)組+鏈表)+紅黑樹,這一點(diǎn)和HashMap是一樣的。

Hashtable是將所有的方法進(jìn)行同步,效率低下。而ConcurrentHashMap作為一個(gè)高并發(fā)的容器,它是通過部分鎖定+CAS算法來進(jìn)行實(shí)現(xiàn)線程安全的。CAS算法也可以認(rèn)為是樂觀鎖的一種~

在高并發(fā)環(huán)境下,統(tǒng)計(jì)數(shù)據(jù)(計(jì)算size...等等)其實(shí)是無意義的,因?yàn)樵谙乱粫r(shí)刻size值就變化了。

get方法是非阻塞,無鎖的。重寫Node類,通過volatile修飾next來實(shí)現(xiàn)每次獲取都是最新設(shè)置的值

ConcurrentHashMap的key和Value都不能為null

參考資料:

https://blog.csdn.net/u010723709/article/details/48007881

https://blog.csdn.net/melod_bc/article/details/54150679

https://blog.csdn.net/panweiwei1994/article/details/78897275

https://www.jianshu.com/p/e694f1e868ec

明天要是無意外的話,可能會(huì)寫Set集合,敬請(qǐng)期待哦~~~~

文章的目錄導(dǎo)航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/69054.html

相關(guān)文章

  • Java集合總結(jié)【面試題+腦圖】,將知識(shí)點(diǎn)一網(wǎng)打盡!

    摘要:而在集合中,值僅僅是一個(gè)對(duì)象罷了該對(duì)象對(duì)本身而言是無用的。將這篇文章作為集合的總結(jié)篇,但覺得沒什么好寫就回答一些面試題去了,找了一會(huì)面試題又覺得不夠系統(tǒng)。 前言 聲明,本文用的是jdk1.8 花了一個(gè)星期,把Java容器核心的知識(shí)過了一遍,感覺集合已經(jīng)無所畏懼了!!(哈哈哈....),現(xiàn)在來總結(jié)一下吧~~ 回顧目錄: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Ma...

    yearsj 評(píng)論0 收藏0
  • 3分鐘搞掂Set集合

    摘要:下面總結(jié)一下集合常用的三個(gè)子類吧無序,允許為,底層是散列表紅黑樹,非線程同步有序,不允許為,底層是紅黑樹非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結(jié)論而言我們就可以根據(jù)自己的實(shí)際情況來使用了。 前言 聲明,本文用的是jdk1.8 前面章節(jié)回顧: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡(jiǎn)單【源碼...

    widuu 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    supernavy 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評(píng)論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    wangdai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<