HashMap和ConcurrentHashMap的區別。
1. HashMap是非安全執行緒的,ConurrentHashMap是安全執行緒的。
2. ConcurrentHashMap將整個Hash桶進行了分段segment,也就是將這個大的數組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖的存在,那麼在插入元素的時候就需要先找到應該插入到哪一個片段segment,然後再在這個片段上面進行插入,而且這裡還需要擷取segment鎖。
3.ConcurrentHashMap讓鎖的粒度更精細一些,並發效能更好。
ConcurrentHashMap安全執行緒嗎。ConcurrentHashMap如何保證安全執行緒。
1. HashTable容器在競爭激烈的並發環境下表現出效率低下的原因是所有訪問HashTable的線程都必須競爭同一把鎖,那假如容器裡有多把鎖,每一把鎖用於鎖容器中的一部分資料,那麼當多線程訪問容器裡不同資料區段的資料時,線程間就不會存在鎖競爭,從而可以有效提高並發訪問效率,這就是ConcurrentHashMap所使用的分段鎖技術,首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個線程佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他線程訪問。
2. get操作的高效之處在於整個get過程不需要加鎖,除非讀到的值是空的才會加鎖重讀。get方法裡將要使用的共用變數都定義成volatile,如果用於統計當前segment大小的count欄位和用於儲存值的HashEntry的value。定義成volatile的變數,能夠線上程之間保持可見度,能夠被多線程同時讀,並且保證不會讀到到期的值,但是只能被單線程寫(有一種情況可以被多線程寫,就是寫入的值不依賴於原值),在get操作裡只需要讀不需要寫共用變數的count和value,所以可以不用加鎖。
3. Put方法首先定位到segment,然後在segment裡進行插入操作。插入操作需要經曆兩個步驟,第一步判斷是否需要對segment裡的HashEntry數組進行擴容,第二部定位添加元素的位置然後放在HashEntry數組裡。