日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

ConcurrentHashMap如何保證線程安全?

來源: 責編: 時間:2024-06-17 08:46:36 239觀看
導讀ConcurrentHashMap 是 HashMap 的多線程版本,HashMap 在并發(fā)操作時會有各種問題,比如死循環(huán)問題、數(shù)據覆蓋等問題。而這些問題,只要使用 ConcurrentHashMap 就可以完美解決了,那問題來了,ConcurrentHashMap 是如何保證線程

Gx428資訊網——每日最新資訊28at.com

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

JDK 1.7 底層實現(xiàn)

ConcurrentHashMap 在不同的 JDK 版本中實現(xiàn)是不同的,**在 JDK 1.7 中它使用的是數(shù)組加鏈表的形式實現(xiàn)的,而數(shù)組又分為:大數(shù)組 Segment 和小數(shù)組 HashEntry。**大數(shù)組 Segment 可以理解為 MySQL 中的數(shù)據庫,而每個數(shù)據庫(Segment)中又有很多張表 HashEntry,每個 HashEntry 中又有多條數(shù)據,這些數(shù)據是用鏈表連接的,如下圖所示:Gx428資訊網——每日最新資訊28at.com

Gx428資訊網——每日最新資訊28at.com

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

了解了 ConcurrentHashMap 的底層實現(xiàn),再看它的線程安全實現(xiàn)就比較簡單了。接下來,我們通過添加元素 put 方法,來看 JDK 1.7 中 ConcurrentHashMap 是如何保證線程安全的,具體實現(xiàn)源碼如下:Gx428資訊網——每日最新資訊28at.com

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 內部數(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 到特定位置,如果超過閾值則進行 rehash                // 忽略其他代碼...            }        }    } finally {        // 釋放鎖        unlock();    }    return oldValue;}

從上述源碼我們可以看出,Segment 本身是基于 ReentrantLock 實現(xiàn)的加鎖和釋放鎖的操作,這樣就能保證多個線程同時訪問 ConcurrentHashMap 時,同一時間只有一個線程能操作相應的節(jié)點,這樣就保證了 ConcurrentHashMap 的線程安全了。也就是說 ConcurrentHashMap 的線程安全是建立在 Segment 加鎖的基礎上的,所以我們把它稱之為分段鎖或片段鎖,如下圖所示:Gx428資訊網——每日最新資訊28at.com

Gx428資訊網——每日最新資訊28at.com

JDK 1.8 底層實現(xiàn)

在 JDK 1.7 中,ConcurrentHashMap 雖然是線程安全的,但因為它的底層實現(xiàn)是數(shù)組 + 鏈表的形式,所以在數(shù)據比較多的情況下訪問是很慢的,因為要遍歷整個鏈表,而 JDK 1.8 則使用了數(shù)組 + 鏈表/紅黑樹的方式優(yōu)化了 ConcurrentHashMap 的實現(xiàn),具體實現(xiàn)結構如下:Gx428資訊網——每日最新資訊28at.com

Gx428資訊網——每日最新資訊28at.com

鏈表升級為紅黑樹的規(guī)則:當鏈表長度大于 8,并且數(shù)組的長度大于 64 時,鏈表就會升級為紅黑樹的結構。Gx428資訊網——每日最新資訊28at.com

PS:ConcurrentHashMap 在 JDK 1.8 雖然保留了 Segment 的定義,但這僅僅是為了保證序列化時的兼容性,不再有任何結構上的用處了。Gx428資訊網——每日最新資訊28at.com

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

在 JDK 1.8 中 ConcurrentHashMap 使用的是 CAS + volatile 或 synchronized 的方式來保證線程安全的,它的核心實現(xiàn)源碼如下:Gx428資訊網——每日最新資訊28at.com

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é)點為空            // 利用 CAS 去進行無鎖線程安全操作,如果 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) {                   // 細粒度的同步修改操作...                 }            }            // 如果超過閾值,升級為紅黑樹            if (binCount != 0) {                if (binCount >= TREEIFY_THRESHOLD)                    treeifyBin(tab, i);                if (oldVal != null)                    return oldVal;                break;            }        }    }    addCount(1L, binCount);    return null;}

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

Gx428資訊網——每日最新資訊28at.com

總結

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

本文鏈接:http://m.www897cc.com/showinfo-26-94139-0.htmlConcurrentHashMap如何保證線程安全?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 2024 年度優(yōu)秀 JS 項目揭曉,竟然是它?

下一篇: 使用一鍵腳本搭建自己的鏡像加速倉庫

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現(xiàn)場演示顯示,華為的實況窗可以更高效的展現(xiàn)出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時間業(yè)務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發(fā)送緩慢等各種問題。雖然我們有個監(jiān)控頁面可以根據 topic 維度查看他的發(fā)送狀態(tài),
  • Java NIO內存映射文件:提高文件讀寫效率的優(yōu)秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數(shù)據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業(yè)務的發(fā)展,組織規(guī)模的擴大,越來越多的企業(yè)開始意識到協(xié)作效率對于企業(yè)團隊的重要性,甚至是決定其在某個行業(yè)競爭中突圍的關鍵,是企業(yè)長久生存的根本。得物
  • JavaScript學習 -AES加密算法

    引言在當今數(shù)字化時代,前端應用程序扮演著重要角色,用戶的敏感數(shù)據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據
  • 零售大模型“干中學”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數(shù)登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經針對開發(fā)者公布了HarmonyOS4.0,以便于開發(fā)者提前進行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久爱www久久做| 激情一区二区| 欧美国产欧美综合| 欧美巨乳在线| 国产精品一二一区| 国模吧视频一区| 亚洲精品免费在线播放| 亚洲视频一区二区| 久久国产66| 欧美国产日韩免费| 国产精品久久久久久久久久直播 | 欧美高清免费| 国产精品国产三级国产| 激情久久五月天| 99一区二区| 久久精品国产亚洲5555| 欧美精品一区二| 国产婷婷一区二区| 亚洲久久一区二区| 亚洲在线播放| 欧美 日韩 国产在线| 国产精品久久久久久影视| 国产一区二区中文字幕免费看| 亚洲日本国产| 久久aⅴ国产欧美74aaa| 欧美日韩免费视频| 影音先锋亚洲电影| 亚洲欧美在线另类| 欧美激情bt| 国产有码在线一区二区视频| 制服丝袜亚洲播放| 免费看亚洲片| 国产亚洲a∨片在线观看| 99re6这里只有精品视频在线观看 99re6这里只有精品 | 影音先锋成人资源站| 亚洲午夜性刺激影院| 欧美aaa级| 国产一区二区丝袜高跟鞋图片| 一区二区三区视频在线| 蜜臀久久99精品久久久画质超高清 | 欧美日韩国产va另类| 激情校园亚洲| 羞羞色国产精品| 欧美日韩国产综合视频在线观看 | 亚洲一区二区三区午夜| 欧美不卡在线| 国产在线国偷精品产拍免费yy| 在线亚洲激情| 欧美精品久久久久久久免费观看| 狠狠爱www人成狠狠爱综合网| 亚洲欧美春色| 欧美色视频一区| 亚洲精品字幕| 欧美成人免费播放| 在线观看日韩av电影| 久久国产一区| 国产精品永久免费视频| 亚洲深夜福利视频| 欧美日本中文字幕| 亚洲韩国精品一区| 久热精品视频在线观看| 狠狠久久亚洲欧美专区| 欧美一级免费视频| 国产精品一区一区| 亚洲资源在线观看| 国产精品草莓在线免费观看| 日韩亚洲精品电影| 欧美精品二区三区四区免费看视频| 精品成人一区二区| 久久久一区二区| 国内精品伊人久久久久av一坑| 欧美一区二区三区播放老司机| 国产精品久久亚洲7777| 亚洲神马久久| 国产精品xxxxx| 亚洲五月六月| 国产精品美女主播| 亚洲欧美成人| 国产乱码精品一区二区三区不卡| 亚洲尤物视频在线| 国产精品嫩草久久久久| 亚洲欧美色婷婷| 国产伦精品一区二区三区视频孕妇 | 亚洲国产日韩在线一区模特| 乱人伦精品视频在线观看| 悠悠资源网久久精品| 蜜桃伊人久久| 亚洲人成网站色ww在线| 欧美精品一区三区| 一区二区三区 在线观看视| 欧美日韩一区二区三区视频 | 欧美风情在线观看| 日韩小视频在线观看| 欧美日韩国产成人精品| 国产精品99久久久久久久女警| 国产精品大片wwwwww| 亚洲欧美日韩精品久久久久| 国产视频丨精品|在线观看| 久久爱另类一区二区小说| 好男人免费精品视频| 久久久综合激的五月天| 亚洲福利专区| 欧美日韩国产页| 亚洲永久精品国产| 国产一区二区三区四区| 久久午夜电影网| 91久久精品国产| 欧美日韩在线免费观看| 午夜精品久久久久久99热| 国产综合色精品一区二区三区| 米奇777超碰欧美日韩亚洲| 亚洲毛片一区| 国产精品免费电影| 久久久亚洲高清| 亚洲人午夜精品免费| 国产精品二区三区四区| 久久大综合网| 亚洲人体一区| 国产精品欧美日韩一区| 久久久久综合一区二区三区| 亚洲精品国产精品久久清纯直播| 欧美午夜精品久久久久免费视| 欧美一区2区三区4区公司二百| 在线精品福利| 欧美视频专区一二在线观看| 久久国产精品久久久久久| 亚洲黄色在线看| 国产精品国产三级国产专播品爱网 | 亚洲少妇最新在线视频| 国产日韩欧美一区二区| 欧美高清成人| 午夜伦欧美伦电影理论片| 在线观看亚洲a| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲男女自偷自拍图片另类| 永久域名在线精品| 欧美性色综合| 久久亚洲精品伦理| 亚洲图片在线观看| 亚洲电影成人| 国产精品一区2区| 欧美激情一区二区三区在线视频 | 亚洲一区二区久久| 欲香欲色天天天综合和网| 国产精品99免费看| 美女脱光内衣内裤视频久久网站| 亚洲一区二区在线免费观看视频| 精品盗摄一区二区三区| 国产精品久久久久aaaa| 免费在线观看日韩欧美| 欧美亚洲自偷自偷| 99精品福利视频| 在线欧美电影| 国产日韩视频一区二区三区| 欧美日韩精品福利| 久久在线视频在线| 午夜精品久久久久影视| 99香蕉国产精品偷在线观看| 在线观看精品一区| 国产日韩欧美亚洲| 国产精品福利在线观看网址| 欧美成人高清视频| 久久久国产一区二区| 亚洲免费在线视频| 99精品国产在热久久| 亚洲电影免费在线观看| 国产美女精品免费电影| 欧美三级欧美一级| 欧美激情五月| 免费亚洲视频| 久久久久久综合网天天| 午夜精品剧场| 亚洲一级影院| 一本综合久久| 99精品福利视频| 亚洲精品女人| 亚洲人成网站在线播| 亚洲大片av| 精品动漫3d一区二区三区| 国产亚洲精品久| 国产麻豆午夜三级精品| 国产精品久久久久aaaa樱花| 欧美日韩另类视频| 欧美精品一二三| 欧美黑人一区二区三区| 免费成人av在线看| 久久久久久久91| 久久大逼视频| 欧美在线一二三区| 欧美在线观看一区二区| 午夜久久久久久| 午夜精品久久久久久久久久久久久| 亚洲深爱激情| 中文欧美日韩| 亚洲视频1区| 亚洲视频日本| 亚洲一区二区在线免费观看| 亚洲午夜一二三区视频| 在线一区二区三区做爰视频网站| 亚洲精品一区二区三区婷婷月| 亚洲精品久久久久| 亚洲美女少妇无套啪啪呻吟| 日韩视频专区| 中国女人久久久|