精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說ConcurrentHashMap底層實(shí)現(xiàn)原理?

開發(fā) 前端
ConcurrentHashMap 在 JDK 1.7 時(shí)使用的是數(shù)據(jù)加鏈表的形式實(shí)現(xiàn)的,其中數(shù)組分為兩類:大數(shù)組 Segment 和小數(shù)組 HashEntry,而加鎖是通過給 Segment 添加 ReentrantLock 鎖來實(shí)現(xiàn)線程安全的。

ConcurrentHashMap 是 HashMap 的多線程版本,HashMap 在并發(fā)操作時(shí)會(huì)有各種問題,比如死循環(huán)問題、數(shù)據(jù)覆蓋等問題。而這些問題,只要使用 ConcurrentHashMap 就可以完美解決了,那問題來了,ConcurrentHashMap 是如何保證線程安全的?它的底層又是如何實(shí)現(xiàn)的?接下來我們一起來看。

JDK 1.7 底層實(shí)現(xiàn)

ConcurrentHashMap 在不同的 JDK 版本中實(shí)現(xiàn)是不同的,在 JDK 1.7 中它使用的是數(shù)組加鏈表的形式實(shí)現(xiàn)的,而數(shù)組又分為:大數(shù)組 Segment 和小數(shù)組 HashEntry。大數(shù)組 Segment 可以理解為 MySQL 中的數(shù)據(jù)庫,而每個(gè)數(shù)據(jù)庫(Segment)中又有很多張表 HashEntry,每個(gè) HashEntry 中又有多條數(shù)據(jù),這些數(shù)據(jù)是用鏈表連接的,如下圖所示:

JDK 1.7 線程安全實(shí)現(xiàn)

了解了 ConcurrentHashMap 的底層實(shí)現(xiàn),再看它的線程安全實(shí)現(xiàn)就比較簡(jiǎn)單了。接下來,我們通過添加元素 put 方法,來看 JDK 1.7 中 ConcurrentHashMap 是如何保證線程安全的,具體實(shí)現(xiàn)源碼如下:

final V put(K key, int hash, V value, boolean onlyIfAbsent) {
    // 在往該 Segment 寫入前,先確保獲取到鎖
    HashEntry<K,V> node = tryLock() ? null : scanAndLockForPut(key, hash, value); 
    V oldValue;
    try {
        // Segment 內(nèi)部數(shù)組
        HashEntry<K,V>[] tab = table;
        int index = (tab.length - 1) & hash;
        HashEntry<K,V> first = entryAt(tab, index);
        for (HashEntry<K,V> e = first;;) {
            if (e != null) {
                K k;
                // 更新已有值...
            }
            else {
                // 放置 HashEntry 到特定位置,如果超過閾值則進(jìn)行 rehash
                // 忽略其他代碼...
            }
        }
    } finally {
        // 釋放鎖
        unlock();
    }
    return oldValue;
}

從上述源碼我們可以看出,Segment 本身是基于 ReentrantLock 實(shí)現(xiàn)的加鎖和釋放鎖的操作,這樣就能保證多個(gè)線程同時(shí)訪問 ConcurrentHashMap 時(shí),同一時(shí)間只有一個(gè)線程能操作相應(yīng)的節(jié)點(diǎn),這樣就保證了 ConcurrentHashMap 的線程安全了。也就是說 ConcurrentHashMap 的線程安全是建立在 Segment 加鎖的基礎(chǔ)上的,所以我們把它稱之為分段鎖或片段鎖,如下圖所示:

JDK 1.8 底層實(shí)現(xiàn)

在 JDK 1.7 中,ConcurrentHashMap 雖然是線程安全的,但因?yàn)樗牡讓訉?shí)現(xiàn)是數(shù)組 + 鏈表的形式,所以在數(shù)據(jù)比較多的情況下訪問是很慢的,因?yàn)橐闅v整個(gè)鏈表,而 JDK 1.8 則使用了數(shù)組 + 鏈表/紅黑樹的方式優(yōu)化了 ConcurrentHashMap 的實(shí)現(xiàn),具體實(shí)現(xiàn)結(jié)構(gòu)如下:

鏈表升級(jí)為紅黑樹的規(guī)則:當(dāng)鏈表長度大于 8,并且數(shù)組的長度大于 64 時(shí),鏈表就會(huì)升級(jí)為紅黑樹的結(jié)構(gòu)。

PS:ConcurrentHashMap 在 JDK 1.8 雖然保留了 Segment 的定義,但這僅僅是為了保證序列化時(shí)的兼容性,不再有任何結(jié)構(gòu)上的用處了。

JDK 1.8 線程安全實(shí)現(xiàn)

在 JDK 1.8 中 ConcurrentHashMap 使用的是 CAS + volatile 或 synchronized 的方式來保證線程安全的,它的核心實(shí)現(xiàn)源碼如下:

final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException();
    int hash = spread(key.hashCode());
    int binCount = 0;
    for (Node<K,V>[] tab = table;;) {
        Node<K,V> f; int n, i, fh; K fk; V fv;
        if (tab == null || (n = tab.length) == 0)
            tab = initTable();
        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { // 節(jié)點(diǎn)為空
            // 利用 CAS 去進(jìn)行無鎖線程安全操作,如果 bin 是空的
            if (casTabAt(tab, i, null, new Node<K,V>(hash, key, value)))
                break; 
        }
        else if ((fh = f.hash) == MOVED)
            tab = helpTransfer(tab, f);
        else if (onlyIfAbsent
                 && fh == hash
                 && ((fk = f.key) == key || (fk != null && key.equals(fk)))
                 && (fv = f.val) != null)
            return fv;
        else {
            V oldVal = null;
            synchronized (f) {
                   // 細(xì)粒度的同步修改操作... 
                }
            }
            // 如果超過閾值,升級(jí)為紅黑樹
            if (binCount != 0) {
                if (binCount >= TREEIFY_THRESHOLD)
                    treeifyBin(tab, i);
                if (oldVal != null)
                    return oldVal;
                break;
            }
        }
    }
    addCount(1L, binCount);
    return null;
}

從上述源碼可以看出,在 JDK 1.8 中,添加元素時(shí)首先會(huì)判斷容器是否為空,如果為空則使用 volatile 加 CAS 來初始化。如果容器不為空則根據(jù)存儲(chǔ)的元素計(jì)算該位置是否為空,如果為空則利用 CAS 設(shè)置該節(jié)點(diǎn);如果不為空則使用 synchronize 加鎖,遍歷桶中的數(shù)據(jù),替換或新增節(jié)點(diǎn)到桶中,最后再判斷是否需要轉(zhuǎn)為紅黑樹,這樣就能保證并發(fā)訪問時(shí)的線程安全了。我們把上述流程簡(jiǎn)化一下,我們可以簡(jiǎn)單的認(rèn)為在 JDK 1.8 中,ConcurrentHashMap 是在頭節(jié)點(diǎn)加鎖來保證線程安全的,鎖的粒度相比 Segment 來說更小了,發(fā)生沖突和加鎖的頻率降低了,并發(fā)操作的性能就提高了。而且 JDK 1.8 使用的是紅黑樹優(yōu)化了之前的固定鏈表,那么當(dāng)數(shù)據(jù)量比較大的時(shí)候,查詢性能也得到了很大的提升,從之前的 O(n) 優(yōu)化到了 O(logn) 的時(shí)間復(fù)雜度,具體加鎖示意圖如下:

小結(jié)

ConcurrentHashMap 在 JDK 1.7 時(shí)使用的是數(shù)據(jù)加鏈表的形式實(shí)現(xiàn)的,其中數(shù)組分為兩類:大數(shù)組 Segment 和小數(shù)組 HashEntry,而加鎖是通過給 Segment 添加 ReentrantLock 鎖來實(shí)現(xiàn)線程安全的。而 JDK 1.8 中 ConcurrentHashMap 使用的是數(shù)組+鏈表/紅黑樹的方式實(shí)現(xiàn)的,它是通過 CAS 或 synchronized 來實(shí)現(xiàn)線程安全的,并且它的鎖粒度更小,查詢性能也更高。

責(zé)任編輯:姜華 來源: Java面試真題解析
相關(guān)推薦

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫連接

2025-04-08 00:00:00

@AsyncSpring異步

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-09-04 17:35:09

2024-08-12 17:36:54

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-09-20 08:36:43

零拷貝數(shù)據(jù)傳輸DMA

2024-03-22 06:56:24

零拷貝技術(shù)數(shù)據(jù)傳輸數(shù)據(jù)拷貝

2021-05-20 08:34:03

CDN原理網(wǎng)絡(luò)

2024-03-06 15:38:06

Spring微服務(wù)架構(gòu)擴(kuò)展組件

2025-02-28 00:00:00

2024-06-04 09:02:03

2024-11-15 15:27:09

2021-06-07 17:12:22

線程安全Atomic

2025-04-07 00:00:00

MySQL數(shù)據(jù)庫服務(wù)器

2020-07-02 07:52:11

RedisHash映射
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

色偷偷久久一区二区三区| 91麻豆高清视频| 久久影院模特热| 日本久久久久久久久久| 手机在线观看av网站| 国产片一区二区| 97超碰人人模人人爽人人看| 国产精品suv一区二区69| 亚洲va久久久噜噜噜久久| 欧美日韩www| 欧美精品99久久| 日本美女高清在线观看免费| 成人动漫中文字幕| 国产日韩欧美黄色| 精品国产免费观看| 91成人观看| 亚洲女人天堂网| 国产在线a视频| 色综合一本到久久亚洲91| 亚洲最色的网站| 水蜜桃亚洲一二三四在线| 亚洲女人18毛片水真多| 日韩国产欧美在线观看| 久久免费少妇高潮久久精品99| 内射毛片内射国产夫妻| 青青一区二区| 精品三级在线看| 欧美视频国产视频| 欧美韩国亚洲| 欧美日韩国产专区| 日本免费成人网| av在线免费一区| 91小视频在线免费看| 成人h视频在线观看| 88av在线视频| 丝袜诱惑制服诱惑色一区在线观看 | 国产精品扒开腿爽爽爽视频| 日韩欧美大片在线观看| 艳女tv在线观看国产一区| 中文字幕日韩av| 最近中文字幕免费| 日韩三级毛片| 日韩国产一区三区| 污污污www精品国产网站| 精品视频一区二区三区| 欧美久久久久久蜜桃| 热久久精品免费视频| 中文字幕 在线观看| 精品久久香蕉国产线看观看gif| 欧美这里只有精品| 天使と恶魔の榨精在线播放| 亚洲欧美在线另类| 一区二区三区在线视频111| 福利小视频在线观看| 国产亚洲午夜高清国产拍精品| 久久国产日韩欧美| 亚洲aⅴ乱码精品成人区| 不卡av在线免费观看| 国产精品久久久久久免费观看| 精品人妻aV中文字幕乱码色欲| 精品无人码麻豆乱码1区2区| 91午夜在线播放| 99久久精品无免国产免费| 久久99热国产| 亚洲一区二区三区xxx视频| 国产视频在线一区| 国产成人综合网站| 国产精品成人观看视频免费| 手机av免费在线观看| 不卡欧美aaaaa| 久久综合一区| 国产免费av高清在线| 国产精品美女久久久久aⅴ | 国产偷倩在线播放| 亚洲成人综合视频| 日韩中文字幕三区| 综合在线影院| 欧美电影影音先锋| 少妇伦子伦精品无吗| 欧美电影在线观看完整版| 亚洲欧美成人网| 国产无遮挡在线观看| 久久精品国内一区二区三区水蜜桃| 欧美不卡视频一区发布| 日韩精品久久久久久久| 视频一区二区三区在线| 成人精品网站在线观看| 亚洲欧美另类日韩| 91网页版在线| 免费在线精品视频| 色网在线免费观看| 制服丝袜亚洲精品中文字幕| 性活交片大全免费看| 免费视频亚洲| 欧美猛男性生活免费| 久久久久久91亚洲精品中文字幕| 日本va欧美va瓶| 国产激情一区二区三区在线观看| 男女视频在线观看免费| 亚洲欧美偷拍另类a∨色屁股| 精品人妻少妇一区二区| 黄色精品视频| 精品免费视频一区二区| 国产传媒国产传媒| 一区福利视频| 成人中文字幕+乱码+中文字幕| 三级网站免费观看| 中文字幕一区二区三区在线观看| 日本在线xxx| 日韩精品视频在线看| 亚洲性夜色噜噜噜7777| 69精品久久久| 国产在线一区观看| 欧美亚洲另类久久综合| 日本性爱视频在线观看| 在线观看国产日韩| 亚洲自拍偷拍精品| 欧美一区亚洲| 国产精品美乳在线观看| 亚洲日本香蕉视频| 亚洲激情第一区| www.久久久精品| 伊人春色之综合网| 97精品国产97久久久久久免费 | 亚洲天堂男人天堂| 亚洲精品77777| 国产成人免费xxxxxxxx| 伊人久久大香线蕉午夜av| 韩国美女久久| 日韩电影中文字幕在线| 国产亚洲精品av| 国产美女av一区二区三区| 亚洲视频小说| 97欧美成人| 日韩av在线免费| 精品久久免费视频| 国产91精品在线观看| 国产大尺度在线观看| 国产成人免费| 一区二区三区久久精品| 国产在线观看黄色| 91女人视频在线观看| www在线观看免费| 里番精品3d一二三区| 久久久久久久久国产精品| 99在线观看精品视频| 亚洲精品少妇30p| 韩国三级hd中文字幕有哪些| 亚洲精品888| 5566中文字幕一区二区| av香蕉成人| 欧美一区二区三区不卡| 欧美成人一二三区| 国产91精品一区二区麻豆网站 | 不卡视频观看| 精品视频www| 亚洲欧美精品一区二区三区| 91论坛在线播放| 久久久精品在线视频| 国内精品伊人久久久| 国产成人亚洲综合| 91亚洲精选| 91精品黄色片免费大全| 国产女人被狂躁到高潮小说| 国产成人在线看| 国产av天堂无码一区二区三区| 伦理一区二区| 国产成人精品久久| 香蕉国产在线视频| 色婷婷久久综合| 免费成人美女女在线观看| 寂寞少妇一区二区三区| 成人免费a级片| 三级小说欧洲区亚洲区| 国产精品美女久久久久久免费| 欧美三级理伦电影| 精品美女在线观看| 久久精品视频1| 国产精品色哟哟| 五月天国产视频| 亚洲韩日在线| 午夜精品一区二区在线观看| www.成人在线.com| 555www成人网| 伊人免费在线| 亚洲成人激情在线观看| 免费黄色片视频| 亚洲日本在线天堂| 久久国产精品无码一级毛片| 麻豆成人久久精品二区三区小说| 国产麻豆电影在线观看| 日韩精品福利一区二区三区| 国产欧美亚洲视频| 性国裸体高清亚洲| 久久国产天堂福利天堂| 日韩a级作爱片一二三区免费观看| 欧美少妇xxx| 国产精品99精品| 国产精品久久久久久亚洲伦| 视频免费在线观看| 国产一区二区三区av电影| 九色在线视频观看| 91精品一区二区三区综合| 欧美精品一区二区三区在线四季| 999精品视频在线观看| 欧美诱惑福利视频| 亚洲性图自拍| 在线成人免费网站| 色香蕉在线视频| 884aa四虎影成人精品一区| 日本一区二区三区精品| 一区二区三区在线观看视频| 91精品国自产在线| 26uuu色噜噜精品一区二区| 一级黄色免费毛片| 日本 国产 欧美色综合| 欧美视频在线播放一区| 欧美成人亚洲| 久久久一二三四| 精品一区二区三区中文字幕老牛| 国产伦理一区二区三区| 国产精品久久久久久久久久久久久久久 | 亚洲黄色激情视频| 亚洲一区二区三区在线| 中文字幕乱码av| 欧美国产视频在线| 精品无码人妻一区| 99国内精品久久| 国产精品无码电影| 国产成人鲁色资源国产91色综| 三年中文在线观看免费大全中国| 日韩国产一区二| av免费网站观看| 天堂蜜桃91精品| 日韩欧美精品在线观看视频| 国产精品视频| 日本精品免费在线观看| 国产日韩欧美三级| 免费高清在线观看免费| 中文一区在线| 国产又黄又大又粗视频| 国产日韩1区| 男人日女人逼逼| 亚洲综合好骚| 亚洲爆乳无码专区| 久久久综合网| 超碰av在线免费观看| 男女男精品视频| 日韩精品你懂的| 蜜桃久久av一区| 在线观看免费的av| 激情亚洲综合在线| 杨幂一区二区国产精品| 夫妻av一区二区| 日本三级日本三级日本三级极| 波多野洁衣一区| 久久久久久久久免费看无码| www久久精品| 精品人伦一区二区| 亚洲天堂精品在线观看| 天天做夜夜爱爱爱| 亚洲自拍偷拍网站| 青青操免费在线视频| 日本高清成人免费播放| 怡红院男人天堂| 欧美一区二区三区免费| 男人天堂一区二区| 亚洲精品在线观看www| 91精彩视频在线播放| 精品国模在线视频| 福利写真视频网站在线| 国产91|九色| 91九色综合| 国产精品国产精品| 一区二区小说| 国产一二三四五| 国产精品美女久久久| 性欧美videossex精品| 国产麻豆精品theporn| 黄色av网址在线观看| 国产亚洲欧洲997久久综合 | 欧美影视一区在线| 国产强被迫伦姧在线观看无码| 亚洲精品一线二线三线| 国产粉嫩一区二区三区在线观看| 精品国产一区二区三区久久狼黑人| 伊人精品影院| 日韩av三级在线观看| 国产精品美女久久久久| 久久精品中文字幕一区二区三区| 日韩中文字幕高清在线观看| 久久综合久久久久| 肉肉av福利一精品导航| 99久久综合网| 国产人妖乱国产精品人妖| 青娱乐在线视频免费观看| 色激情天天射综合网| 亚洲精品国产手机| 中文字幕在线看视频国产欧美| 蜜臀av国内免费精品久久久夜夜| 国产精品免费久久久| 免费萌白酱国产一区二区三区| 综合视频免费看| 亚洲一区激情| 亚洲精品乱码久久久久久9色| 国产三级精品视频| 精品一区免费观看| 欧美一区二区精品久久911| 黄视频在线观看免费| 欧美日韩成人在线视频| 日本亚洲欧洲无免费码在线| 久久精品国产精品青草色艺| 欧美1区免费| 九九热精品国产| 国产亚洲精品资源在线26u| 国产无码精品在线观看| 日韩一区二区视频| 欧美一区二区三区在线观看免费| 日本久久久久久久久| av在线亚洲色图| 今天免费高清在线观看国语| 美女高潮久久久| 色哟哟精品观看| 福利视频一区二区| 黄色三级网站在线观看| 精品自拍视频在线观看| www.欧美| 欧美日韩亚洲国产成人| 久久精品国产99国产精品| 天天舔天天操天天干| 欧美天堂在线观看| 无码精品黑人一区二区三区 | 中文字幕一区二区三区四区五区人| 久久青草久久| 国产精品久久久久无码av色戒| 天天操天天色综合| 亚洲欧美另类综合| 久久久免费在线观看| 4438全国亚洲精品观看视频| 欧美视频在线第一页| 国产一区二区免费看| 乱h高h女3p含苞待放| 91精品国产综合久久精品麻豆| 欧美日韩xx| 国产日韩欧美影视| 婷婷伊人综合| 亚洲女人在线观看| 亚洲摸摸操操av| 国产高清第一页| 欧美黄网免费在线观看| 超碰在线亚洲| 国产精品999视频| 久久综合九色综合97婷婷女人 | 日韩免费高清av| 人妖欧美1区| 国产日韩二区| 国产一区二区三区成人欧美日韩在线观看 | 99久久精品久久久久久清纯| 你懂的国产在线| 一区二区三区高清国产| a一区二区三区亚洲| 国产乱人伦精品一区二区三区| 国产99一区视频免费 | 欧美日韩国产免费一区二区| 日本视频不卡| 99久热re在线精品996热视频| 在线不卡视频| 国产精品免费无码| 6080yy午夜一二三区久久| 牛牛精品在线| 欧美一区二区福利| 久久精品噜噜噜成人av农村| 欧美精品乱码视频一二专区| 亚洲国产97在线精品一区| 亚洲成av在线| 久久av喷吹av高潮av| 成人爱爱电影网址| 久久永久免费视频| 麻豆国产va免费精品高清在线| 女同久久另类99精品国产| 91香蕉视频污版| 亚洲主播在线观看| 欧美在线观看在线观看| 91在线视频成人| 一区二区国产精品| 男人av资源站| 日韩av影院在线观看| 日本午夜免费一区二区| 人妻熟妇乱又伦精品视频| 国产精品婷婷午夜在线观看| 懂色av一区二区三区四区| 国产精品69精品一区二区三区| 亚洲一区二区| 在线免费看黄视频| 精品日韩一区二区| 欧美少妇激情| 日韩中文字幕在线视频观看| 中文字幕亚洲不卡| 欧美日韩视频精品二区| 99久久综合狠狠综合久久止|