HashMap與ConcurrentHashMap的區別

來源:互聯網
上載者:User

標籤:style   blog   http   ar   java   for   sp   div   on   

從JDK1.2起,就有了HashMap,正如前一篇文章所說,HashMap不是安全執行緒的,因此多線程操作時需要格外小心。

在JDK1.5中,偉大的Doug Lea給我們帶來了concurrent包,從此Map也有安全的了。



ConcurrentHashMap具體是怎麼實現安全執行緒的呢,肯定不可能是每個方法加synchronized,那樣就變成了HashTable。

從ConcurrentHashMap代碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable,根據key.hashCode()來決定把key放到哪個HashTable中。

在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中:






測試程式:

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapTest {private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>();public static void main(String[] args) {new Thread("Thread1"){@Overridepublic void run() {map.put(3, 33);}};new Thread("Thread2"){@Overridepublic void run() {map.put(4, 44);}};new Thread("Thread3"){@Overridepublic void run() {map.put(7, 77);}};System.out.println(map);}}

ConcurrentHashMap中預設是把segments初始化為長度為16的數組。

根據ConcurrentHashMap.segmentFor的演算法,3、4對應的Segment都是segments[1],7對應的Segment是segments[12]。

(1)Thread1和Thread2先後進入Segment.put方法時,Thread1會首先擷取到鎖,可以進入,而Thread2則會阻塞在鎖上:


(2)切換到Thread3,也走到Segment.put方法,因為7所儲存的Segment和3、4不同,因此,不會阻塞在lock():



以上就是ConcurrentHashMap的工作機制,通過把整個Map分為N個Segment(類似HashTable),可以提供相同的安全執行緒,但是效率提升N倍,預設提升16倍。


HashMap與ConcurrentHashMap的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.