精品欧美一区二区三区在线观看 _久久久久国色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)

欧美激情福利| av基地在线| 国产欧美日韩亚洲一区二区三区| 亚洲精品乱码久久久久久金桔影视 | 久久久久久久久岛国免费| 国产精品激情av电影在线观看 | 欧美91大片| 日韩精品中文字幕在线观看 | 日韩 欧美 中文| 成人激情视频| 精品99一区二区三区| 15—17女人毛片| 国产区美女在线| 国产精品传媒在线| 好吊妞www.84com只有这里才有精品 | 欧美一区二区在线看| 无码人妻精品一区二区三区在线| 91精品大全| 91亚洲精华国产精华精华液| 国产色视频一区| 日产精品久久久| 你懂的国产精品| 日韩最新在线视频| 亚洲国产av一区| 成人福利一区| 91精品在线免费观看| 亚洲不卡视频在线| 美女网站在线看| 亚洲一区av在线| 免费观看国产视频在线| www 日韩| 久久久五月婷婷| 久久久久久久久久久久久久一区| 国产www视频| 美女视频免费一区| 国产精品久久久久久久久久久新郎| 精品在线视频观看| 中文在线日韩| 久久久国产精品视频| 国产精品久久免费观看| 亚洲黄页在线观看| 亚洲国产成人精品女人久久久| 杨幂一区二区国产精品| 97色婷婷成人综合在线观看| 欧美婷婷六月丁香综合色| wwwxxx黄色片| 性欧美freesex顶级少妇| 亚洲风情在线资源站| 大陆极品少妇内射aaaaaa| 黄色网页网址在线免费| 国产精品不卡一区二区三区| 亚洲一区二区三区欧美| 永久av在线| 国产免费成人在线视频| 午夜老司机精品| 午夜免费播放观看在线视频| 国产精品久久久久久久裸模| 日韩精品久久一区二区三区| 国产一二三在线观看| 国产欧美精品一区| 亚洲精品视频一二三| 五月婷婷在线视频| 亚洲男人天堂av| 麻豆映画在线观看| 丰满诱人av在线播放| 亚洲国产综合91精品麻豆| 国产欧美日韩网站| 蜜臀久久精品| 欧美综合视频在线观看| 中文av一区二区三区| 欧美在线一级| 日韩精品一区二区三区视频播放| 美女黄色一级视频| 精品在线91| 日韩中文字幕不卡视频| 久久久久久久久久网站| 尤物网精品视频| 欧洲中文字幕国产精品| 在线免费看av的网站| 国产一区二区三区四区在线观看| 99在线观看| 欧美精品a∨在线观看不卡| 亚洲国产成人午夜在线一区| 亚洲黄色网址在线观看| av剧情在线观看| 色噜噜狠狠一区二区三区果冻| 天天综合网日韩| 清纯唯美激情亚洲| 亚洲第一视频网站| jizz中文字幕| 黑人一区二区| 国产精品三级网站| 欧美在线精品一区二区三区| 久久久久久97三级| 一级性生活视频| 樱花草涩涩www在线播放| 欧美日韩五月天| 欧美xxxxx精品| 日韩欧美一区二区三区在线视频| 欧美激情二区三区| 中文 欧美 日韩| www.视频一区| 中文字幕第一页亚洲| 欧美调教sm| 欧美一级在线免费| a天堂中文字幕| 欧美午夜不卡| 国产精品综合不卡av| 人妻少妇精品无码专区| 国产精品久久二区二区| 免费在线观看亚洲视频| 欧美美女福利视频| 亚洲女同精品视频| 久久综合色综合| 国产专区欧美精品| 日韩欧美精品一区二区| 久久久男人天堂| 欧美变态tickle挠乳网站| 国产一二三四区在线| 亚洲人成免费| 国产高清在线一区| 国产欧美久久久久久久久| 欧美自拍偷拍一区| 国产精品无码网站| 黄色av日韩| 91视频免费在线观看| 日本电影全部在线观看网站视频| 日韩欧美精品中文字幕| 日韩精品视频一区二区| 欧美国产精品| 91亚洲精品视频| 波多野结衣在线影院| 色综合激情久久| 97人妻精品一区二区三区免| 亚洲激情午夜| av一本久道久久波多野结衣| 黄色网页在线免费观看| 欧美日本在线视频| 战狼4完整免费观看在线播放版| 媚黑女一区二区| 免费日韩av电影| 日产福利视频在线观看| 日韩精品中文字| 日韩xxx高潮hd| av影院午夜一区| 成熟丰满熟妇高潮xxxxx视频| 亚洲国产欧美国产第一区| 欧美另类交人妖| www.97超碰| 一区二区三区国产精品| 国产老头和老头xxxx×| 亚洲精品二区三区| 超碰97人人人人人蜜桃| 好看的中文字幕在线播放| 欧美va日韩va| 日韩网红少妇无码视频香港| av资源网一区| 欧美女人性生活视频| 国产最新精品| 国产精品视频一| 黄色在线观看网站| 日韩免费成人网| 日韩av男人天堂| 91免费视频网| 超碰在线公开97| 女人色偷偷aa久久天堂| av一区二区三区免费| 国产精品一区二区日韩| 亚洲久久久久久久久久| 国产免费a视频| 国产精品久久网站| 一个人看的视频www| 国内在线观看一区二区三区| 精品久久久久久一区| 666av成人影院在线观看| 中文字幕不卡在线视频极品| 国产又黄又粗又长| 亚洲午夜精品久久久久久久久| 国产老熟女伦老熟妇露脸| 久久久精品午夜少妇| av动漫免费观看| 久久久久97| 国产精品一二三在线| 日本动漫同人动漫在线观看| 亚洲精品视频在线观看视频| 91国内精品久久久| 五月天精品一区二区三区| 国产精成人品免费观看| 国产麻豆视频一区二区| 欧美精品一区免费| 99视频精品全部免费在线视频| www.久久艹| av激情成人网| 欧美激情一区二区三区久久久| 欧洲综合视频| 日韩欧美亚洲一区二区| 日韩精品成人免费观看视频| 亚洲精品视频在线观看网站| 魔女鞋交玉足榨精调教| 国产一区二区精品久久91| 免费看一级大黄情大片| 亚洲国产老妈| 日韩在线观看电影完整版高清免费| 嫩呦国产一区二区三区av| 国产91在线播放九色快色| 性爱视频在线播放| 在线亚洲欧美视频| 三级网站在线看| 欧美一区二区私人影院日本| 免费看日批视频| 亚洲成人午夜影院| 久久福利免费视频| 久久久精品人体av艺术| 天天躁日日躁狠狠躁av| 韩国v欧美v日本v亚洲v| 九九九在线观看视频| 99精品福利视频| 大地资源网在线观看免费官网| 精品国产一区二区三区av片| 国内精品**久久毛片app| 欧美黄视频在线观看| 国产精品欧美日韩一区二区| 在线最新版中文在线| 久久久久久18| 污视频在线看网站| 久久精品最新地址| 免费黄色电影在线观看| 国产一区二区日韩精品欧美精品| 熟妇高潮一区二区高潮| 精品国偷自产国产一区| aaa国产视频| 欧美日韩国产免费一区二区 | 性色国产成人久久久精品| 久久久久久久久久电影| 精品无码在线视频| www.日韩大片| 亚洲无人区码一码二码三码| 国产黄色成人av| 亚洲欧美日韩一二三区| 韩国欧美国产1区| 手机免费av片| 极品少妇xxxx精品少妇| 可以看污的网站| 精品中文字幕一区二区| 色婷婷一区二区三区av免费看| 奇米影视一区二区三区小说| 日本xxxxxxx免费视频| 久久综合九色| www.xxx亚洲| 日av在线不卡| 国产传媒免费观看| 狠狠色狠狠色合久久伊人| 视频免费1区二区三区| 精品一二三四在线| 亚洲天堂网站在线| 国产精品1区二区.| 亚洲一二三四五| www.日韩精品| 国产高清一区二区三区四区| 国产欧美一区二区在线观看| 99精品全国免费观看| 成人免费在线播放视频| 精品97人妻无码中文永久在线| 一区二区三区成人| 人人干人人干人人干| 欧美性高潮在线| 自拍偷拍福利视频| 777xxx欧美| 免费av网站在线播放| 亚洲精品天天看| 97超碰人人在线| 欧美大学生性色视频| 成人一级福利| 国产精品综合不卡av| 日韩亚洲精品在线观看| 裸模一区二区三区免费| 色综合咪咪久久网| 男人添女人下部视频免费| 亚洲欧美日韩专区| 一个色综合久久| 成人免费视频视频在线观看免费| 亚洲做受高潮无遮挡| 国产精品国产馆在线真实露脸| 日韩女优一区二区| 色一区在线观看| 国产美女永久免费| 亚洲精品白浆高清久久久久久| jizz在线观看视频| 欧美激情视频在线| 亚洲高清黄色| 草莓视频一区| 日韩av专区| 3d动漫一区二区三区| 免费精品视频最新在线| 欧美性生交xxxxx| 国产精品久久久久久久久免费桃花| 国产一级淫片免费| 欧美亚洲图片小说| 天天操天天干天天爱| 久久国产一区二区三区| 色戒汤唯在线观看| 91免费版黄色| 成人精品亚洲| 97国产在线播放| 国产一区二区三区精品视频| 久久中文字幕人妻| 亚洲一区二区三区精品在线| 一区二区视频网| 亚洲免费小视频| 久久香蕉av| 成人一区二区电影| 精品国产成人| 99热自拍偷拍| 成人自拍视频在线| 婷婷久久综合网| 欧美性感一类影片在线播放| 午夜成人鲁丝片午夜精品| 精品中文字幕在线2019| 丁香久久综合| 日本不卡在线播放| 亚洲看片免费| 黄色在线免费播放| 一区二区三区日本| 国产又黄又粗又硬| 深夜福利一区二区| 偷拍视频一区二区三区| 精品国产乱码一区二区三区四区 | 欧美日本高清一区| 亚洲精品一区av| 一区二区三区国| 丝袜a∨在线一区二区三区不卡| 在线观看免费视频国产| 亚洲一区二区三区激情| 成人h动漫精品一区二区无码| 日韩在线观看高清| 亚洲黑人在线| 欧美日韩一级在线| 免费观看日韩电影| www.xx日本| 欧美日韩免费不卡视频一区二区三区| 国产三级视频在线播放线观看| 欧美在线视频观看| 亚洲aaa级| 激情综合网婷婷| 久久久精品一品道一区| 伊人久久久久久久久久久久| 亚洲视频日韩精品| 日韩制服诱惑| 性刺激综合网| 国内精品自线一区二区三区视频| 国产jizz18女人高潮| 欧美丰满一区二区免费视频 | 无码国产精品高潮久久99| 欧美麻豆久久久久久中文| 日韩区欧美区| 日本欧美黄色片| 91蜜桃婷婷狠狠久久综合9色| 在线观看免费国产视频| 精品性高朝久久久久久久| 最新中文字幕在线播放| 日韩精品久久一区二区三区| 久久99蜜桃精品| 免费日韩在线视频| 日韩av在线最新| 免费污视频在线一区| 尤物国产精品| 国产91在线观看丝袜| 影音先锋在线国产| 中文字幕日韩高清| 国产va免费精品观看精品| 日韩成人手机在线| 久久这里只有精品首页| 中文av免费观看| 欧美激情一级精品国产| 亚洲精品进入| 国产永久免费网站| 精品免费在线视频| 午夜视频在线观看网站| 成人在线免费观看一区| 免费日韩av| 色欲人妻综合网| 亚洲乱码国产乱码精品精天堂| 99欧美精品| 免费在线黄网站| 中文无字幕一区二区三区| 亚洲不卡免费视频| 国产91九色视频| 欧美久久一区| 西西444www无码大胆| 日韩三级免费观看| 日本不卡一二三| 国产精品久久久久久久久电影网| 久久久久高清精品| 精品国产无码AV| 国产成人欧美在线观看| 欧美三区视频| 亚洲黄色小说视频| 精品国产制服丝袜高跟| 成人涩涩视频| 男女视频网站在线观看|