HashMap與ConcurrentHashMap的區(qū)別

從JDK1.2起俱萍,就有了HashMap闲延,正如前一篇文章所說痊剖,HashMap不是線程安全的,因此多線程操作時需要格外小心垒玲。
在JDK1.5中陆馁,偉大的Doug Lea給我們帶來了concurrent包,從此Map也有安全的了合愈。


Center.png

ConcurrentHashMap具體是怎么實現(xiàn)線程安全的呢叮贩,肯定不可能是每個方法加synchronized,那樣就變成了HashTable佛析。
從ConcurrentHashMap代碼中可以看出益老,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable寸莫,根據(jù)key.hashCode()來決定把key放到哪個HashTable中捺萌。
在ConcurrentHashMap中,就是把Map分成了N個Segment储狭,put和get的時候互婿,都是現(xiàn)根據(jù)key.hashCode()算出放到哪個Segment中:

測試程序:

import java.util.concurrent.ConcurrentHashMap;  
publicclass ConcurrentHashMapTest {  
privatestatic ConcurrentHashMap map = new ConcurrentHashMap();  
publicstaticvoid main(String[] args) {  
new Thread("Thread1"){  
@Override
publicvoid run() {  
                map.put(3, 33);  
            }  
        };  
new Thread("Thread2"){  
@Override
publicvoid run() {  
                map.put(4, 44);  
            }  
        };  
new Thread("Thread3"){  
@Override
publicvoid run() {  
                map.put(7, 77);  
            }  
        };  
        System.out.println(map);  
    }  
}  

ConcurrentHashMap中默認是把segments初始化為長度為16的數(shù)組。
根據(jù)ConcurrentHashMap.segmentFor的算法辽狈,3慈参、4對應的Segment都是segments[1],7對應的Segment是segments[12]刮萌。

  1. Thread1和Thread2先后進入Segment.put方法時驮配,Thread1會首先獲取到鎖,可以進入着茸,而Thread2則會阻塞在鎖上:
  1. 切換到Thread3壮锻,也走到Segment.put方法,因為7所存儲的Segment和3涮阔、4不同猜绣,因此睬关,不會阻塞在lock():

以上就是ConcurrentHashMap的工作機制小槐,通過把整個Map分為N個Segment(類似HashTable),可以提供相同的線程安全丙唧,但是效率提升N倍伟阔,默認提升16倍辣之。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市皱炉,隨后出現(xiàn)的幾起案子怀估,更是在濱河造成了極大的恐慌,老刑警劉巖合搅,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件多搀,死亡現(xiàn)場離奇詭異,居然都是意外死亡历筝,警方通過查閱死者的電腦和手機酗昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梳猪,“玉大人麻削,你說我怎么就攤上這事〈好郑” “怎么了呛哟?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匿沛。 經(jīng)常有香客問我扫责,道長,這世上最難降的妖魔是什么逃呼? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任鳖孤,我火速辦了婚禮者娱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苏揣。我一直安慰自己黄鳍,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布平匈。 她就那樣靜靜地躺著框沟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪增炭。 梳的紋絲不亂的頭發(fā)上忍燥,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音隙姿,去河邊找鬼梅垄。 笑死,一個胖子當著我的面吹牛输玷,可吹牛的內(nèi)容都是我干的哎甲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼饲嗽,長吁一口氣:“原來是場噩夢啊……” “哼炭玫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起貌虾,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吞加,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尽狠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衔憨,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年袄膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了践图。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡沉馆,死狀恐怖码党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斥黑,我是刑警寧澤揖盘,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站锌奴,受9級特大地震影響兽狭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一箕慧、第九天 我趴在偏房一處隱蔽的房頂上張望服球。 院中可真熱鬧,春花似錦颠焦、人聲如沸有咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婉商,卻和暖如春似忧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丈秩。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工盯捌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蘑秽。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓饺著,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肠牲。 傳聞我的和親對象是個殘疾皇子幼衰,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • ConcurrencyMap 從這一節(jié)開始正式進入并發(fā)容器的部分,來看看JDK 6帶來了哪些并發(fā)容器缀雳。 在JDK ...
    raincoffee閱讀 555評論 0 0
  • Java SE 基礎: 封裝渡嚣、繼承、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務)結(jié)合為一個獨立的整體肥印,并盡...
    Jayden_Cao閱讀 2,103評論 0 8
  • 概述 還記得大學快畢業(yè)的時候要準備找工作了识椰,然后就看各種面試相關(guān)的書籍,還記得很多面試書中都說到: HashMap...
    winwill2012閱讀 1,504評論 3 16
  • Java8張圖 11深碱、字符串不變性 12腹鹉、equals()方法、hashCode()方法的區(qū)別 13敷硅、...
    Miley_MOJIE閱讀 3,697評論 0 11
  • 又周六到了功咒,今天睡得好舒服,原來外面下雨了绞蹦。 起來磨磨蹭蹭將自己收拾下航瞭,然后打開電飯煲,昨晚預約的紅棗粥已經(jīng)香噴噴...
    莊潔淳閱讀 253評論 0 3