请你说明一下ConcurrentHashMap的原理?
ConcurrentHashMap 類中包含兩個靜態內部類 HashEntry 和 Segment。HashEntry 用來封裝映射表的鍵 / 值對;Segment 用來充當鎖的角色,每個 Segment 對象守護整個散列映射表的若干個桶。每個桶是由若干個 HashEntry 對象鏈接起來的鏈表。一個 ConcurrentHashMap 實例中包含由若干個 Segment 對象組成的數組。HashEntry 用來封裝散列映射表中的鍵值對。在 HashEntry 類中,key,hash 和 next 域都被聲明為 final 型,value 域被聲明為 volatile 型。
static final class HashEntry<K,V> {final K key; // 聲明 key 為 final 型final int hash; // 聲明 hash 值為 final 型volatile V value; // 聲明 value 為 volatile 型final HashEntry<K,V> next; // 聲明 next 為 final 型HashEntry(K key, int hash, HashEntry<K,V> next, V value) {this.key = key;this.hash = hash;this.next = next;this.value = value;} }在ConcurrentHashMap 中,在散列時如果產生“碰撞”,將采用“分離鏈接法”來處理“碰撞”:把“碰撞”的 HashEntry 對象鏈接成一個鏈表。由于 HashEntry 的 next 域為 final 型,所以新節點只能在鏈表的表頭處插入。 下圖是在一個空桶中依次插入 A,B,C 三個 HashEntry 對象后的結構圖:
圖1. 插入三個節點后桶的結構示意圖:
注意:由于只能在表頭插入,所以鏈表中節點的順序和插入的順序相反。
Segment 類繼承于 ReentrantLock 類,從而使得 Segment 對象能充當鎖的角色。每個 Segment 對象用來守護其(成員對象 table 中)包含的若干個桶。
總結
以上是生活随笔為你收集整理的请你说明一下ConcurrentHashMap的原理?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 请解释为什么集合类没有实现Cloneab
- 下一篇: 请解释一下TreeMap