聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧

聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧

ID:30849421

大?。?05.25 KB

頁數(shù):9頁

時間:2019-01-04

聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧_第1頁
聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧_第2頁
聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧_第3頁
聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧_第4頁
聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧_第5頁
資源描述:

《聊聊并發(fā)(4):深入分析concurrenthashmap-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。

1、聊聊并發(fā)(4):深入分析ConcurrcntHashMap-編程開發(fā)技術聊聊并發(fā)(4):深入分析ConcurrentHashMap原文出處:方騰總本系列:聊聊并發(fā)(1)深入分析Volatile的實現(xiàn)原理聊聊并發(fā)(2)JavaSE1.6中的Synchronized聊聊并發(fā)(3)Java線程池的分析和使用術語定義術語英文解釋哈希算法hashalgorithm是一種將任意內(nèi)容的輸入轉(zhuǎn)換成相同長度輸出的加密方式,其輸出被稱為哈希值。?哈希表hashtable根據(jù)設定的哈希函數(shù)H(key)和處理沖突方法將一組關鍵字映

2、象到一個有限的地址區(qū)間上,并以關鍵字在地址區(qū)間中的彖作為記錄在表中的存儲位置,這種表稱為哈希表或散列,所得存儲位置稱為哈希地址或散列地址。線程不安全的HashMap因為多線程環(huán)境下,使用Hashmap進行put操作會引起死循環(huán),導致CPU利用率接近100%,所以在并發(fā)情況下不能使用HashMapo如以下代碼:finalIlashMap(2);Threadt=newThread(newRunnable(){?Overri

3、depublicvoidrun()for(inti=0;i<10000;i++){newThread(newRunnable(){?Overridepublicvoidrun(){map.put(UUTD.randomUUTD().toString(),〃〃},〃ftf〃+i)?start();}t.start();t.join();效率低下的HashTable容器?????HashTable容器使用synchronized來保證線程安全,但在線程競爭激烈的情況下HashTable的效率非常低下。因為當一

4、個線程訪問HashTable的同步方法吋,其他線程訪問HashTable的同步方法時,可能會進入阻塞或輪詢狀態(tài)。如線程1使用put進行添加元索,線程2不但不能使用put方法添加元索,并且也不能使用get方法來獲取元素,所以競爭越激烈效率越低。ConcurrentHashMap的鎖分段技術?????HashTable容器在競爭激烈的并發(fā)環(huán)境下農(nóng)現(xiàn)出效率低下的原因,是因為所有訪問HashTable的線程都必須競爭同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其小一部分數(shù)據(jù),那么當多線程訪問容器里不同數(shù)據(jù)段的

5、數(shù)據(jù)時,線程間就不會存在鎖競爭,從而可以有效的提高并發(fā)訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將數(shù)據(jù)分成一段一段的存儲,然后給每一段數(shù)據(jù)配一把鎖,當一個線程山用鎖訪問其中一個段數(shù)據(jù)的吋候,其他段的數(shù)據(jù)也能被其他線程訪問。ConcurrentHashMap的結構我們通過ConcurrentHashMap的類圖來分析ConcurrentHashMap的結構。ConcurrentHashMap是ftlSegment數(shù)組結構和HashEntry數(shù)組結構組成oSegment是一種nJ

6、重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色,HashEntry則用于存儲鍵值對數(shù)據(jù)。一個ConcurrentHashMap里包含一個Segment數(shù)組,Segment的結構和HashMap類似,是一種數(shù)組和鏈表結構,一個Segment里包含一個HashEntry數(shù)組,每個HashEntry是一個鏈表結構的元素,每個Segment守護者一個HashEntry數(shù)組里的元素,當對HashEntry數(shù)組的數(shù)據(jù)進行修改時,必須首先獲得它對應的Segment鎖。9■Concur

7、rentHashMap的初始化ConcurrentHashMap初始化方法是通過initialCapacity,loadFactor,concurrenc)^Level兒個參數(shù)來初始化segments數(shù)組,段偏移量segmentshift,段掩碼segmentMask和每個segment里的HashEntry數(shù)組。初始化segments數(shù)組。讓我們來看一下初始化segmentShift,segmentMask和segments數(shù)組的源代碼。if(concurrencyLevel>MAXSEGMENTS)co

8、ncurrencyLevel=MAX_SEGMENTS;//Findpower-of-twosizesbestmatchingargumentsintsshift二0;intssize=1;while(ssize

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。