6.1 ConcurrentHashMap的實(shí)現(xiàn)原理與使用
(1)HashMap在多線程環(huán)境下進(jìn)行put操作可能導(dǎo)致死循環(huán)瀑罗,是因?yàn)槎嗑€程導(dǎo)致HashMap的Entry鏈表形成環(huán)形數(shù)據(jù)結(jié)構(gòu)侈玄,一旦形成環(huán)形數(shù)據(jù)結(jié)構(gòu),Entry的next節(jié)點(diǎn)永遠(yuǎn)不為空,就會(huì)產(chǎn)生死循環(huán)獲取Entry嫌松。
(2)HashTable使用synchronized來保證線程安全沧奴,在線程競爭激烈的情況下HashTable的效率非常低下。
(3)ConcurrentHashMap使用鎖分段技術(shù)歇竟,首先將數(shù)據(jù)分成一段一段的存儲(chǔ)挥唠,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候焕议,其他段的數(shù)據(jù)也能被其他線程訪問宝磨。
(4)從Java 8開始,HashMap盅安,ConcurrentHashMap和LinkedHashMap在處理頻繁沖突時(shí)將使用平衡樹來代替鏈表唤锉,當(dāng)同一hash桶中的元素?cái)?shù)量超過特定的值便會(huì)由鏈表切換到平衡樹,這會(huì)將get()方法的性能從O(n)提高到O(logn)别瞭。