# ConcurrentHashMap å®ç°åç
ç±äº `HashMap` æ¯ä¸ä¸ªçº¿ç¨ä¸å®å
¨ç容å¨ï¼ä¸»è¦ä½ç°å¨å®¹é大äº`æ»é*è´è½½å å`åçæ©å®¹æ¶ä¼åºç°ç¯å½¢é¾è¡¨ä»èå¯¼è´æ»å¾ªç¯ã
å æ¤éè¦æ¯æçº¿ç¨å®å
¨çå¹¶åå®¹å¨ `ConcurrentHashMap` ã
## æ°æ®ç»æ

å¦å¾æç¤ºï¼æ¯ç± `Segment` æ°ç»ã`HashEntry` æ°ç»ç»æï¼å `HashMap` 䏿 ·ï¼ä»ç¶æ¯æ°ç»å é¾è¡¨ç»æã
`ConcurrentHashMap` éç¨äºåæ®µéææ¯ï¼å
¶ä¸ `Segment` ç»§æ¿äº `ReentrantLock`ãä¸ä¼å `HashTable` 飿 ·ä¸ç®¡æ¯ `put` è¿æ¯ `get` æä½é½éè¦å忥å¤çï¼çè®ºä¸ ConcurrentHashMap æ¯æ `CurrencyLevel` (Segment æ°ç»æ°é)ç线ç¨å¹¶åãæ¯å½ä¸ä¸ªçº¿ç¨å ç¨é访é®ä¸ä¸ª `Segment` æ¶ï¼ä¸ä¼å½±åå°å
¶ä»ç `Segment`ã
## get æ¹æ³
`ConcurrentHashMap` ç `get` æ¹æ³æ¯é叏髿çï¼å 为æ´ä¸ªè¿ç¨é½ä¸éè¦å éã
åªéè¦å° `Key` éè¿ `Hash` ä¹åå®ä½å°å
·ä½ç `Segment` ï¼åéè¿ä¸æ¬¡ `Hash` å®ä½å°å
·ä½çå
ç´ ä¸ãç±äº `HashEntry` ä¸ç `value` 屿§æ¯ç¨ `volatile` å
³é®è¯ä¿®é¥°çï¼ä¿è¯äºå
åå¯è§æ§ï¼æä»¥æ¯æ¬¡è·åæ¶é½æ¯ææ°å¼([volatile ç¸å
³ç¥è¯ç¹](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Threadcore.md#%E5%8F%AF%E8%A7%81%E6%80%A7))ã
## put æ¹æ³
å
é¨ `HashEntry` ç±» ï¼
```java
static final class HashEntry {
final int hash;
final K key;
volatile V value;
volatile HashEntry next;
HashEntry(int hash, K key, V value, HashEntry next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
```
è½ç¶ HashEntry ä¸ç value æ¯ç¨ `volatile` å
³é®è¯ä¿®é¥°çï¼ä½æ¯å¹¶ä¸è½ä¿è¯å¹¶åçååæ§ï¼æä»¥ put æä½æ¶ä»ç¶éè¦å éå¤çã
é¦å
乿¯éè¿ Key ç Hash å®ä½å°å
·ä½ç Segmentï¼å¨ put ä¹åä¼è¿è¡ä¸æ¬¡æ©å®¹æ ¡éªãè¿éæ¯ HashMap è¦å¥½çä¸ç¹æ¯ï¼HashMap æ¯æå
¥å
ç´ ä¹ååçæ¯å¦éè¦æ©å®¹ï¼æå¯è½æ©å®¹ä¹ååç»å°±æ²¡ææå
¥å°±æµªè´¹äºæ¬æ¬¡æ©å®¹(æ©å®¹é常æ¶èæ§è½)ã
è ConcurrentHashMap ä¸ä¸æ ·ï¼å®æ¯å
å°æ°æ®æå
¥ä¹ååæ£æ¥æ¯å¦éè¦æ©å®¹ï¼ä¹åååæå
¥ã
## size æ¹æ³
æ¯ä¸ª `Segment` 齿ä¸ä¸ª `volatile` 修饰çå
¨å±åé `count` ,æ±æ´ä¸ª `ConcurrentHashMap` ç `size` æ¶å¾ææ¾å°±æ¯å°ææç `count` ç´¯å å³å¯ã使¯ `volatile` 修饰çåéå´ä¸è½ä¿è¯å¤çº¿ç¨çååæ§ï¼ææç´æ¥ç´¯å å¾å®¹æåºç°å¹¶åé®é¢ã
ä½å¦ææ¯æ¬¡è°ç¨ `size` æ¹æ³å°å
¶ä½çä¿®æ¹æä½å éæçä¹å¾ä½ãæä»¥åæ³æ¯å
å°è¯ä¸¤æ¬¡å° `count` ç´¯å ï¼å¦æå®¹å¨ç `count` åçäºåååå 鿥ç»è®¡ `size`ã
è³äº `ConcurrentHashMap` æ¯å¦ä½ç¥éå¨ç»è®¡æ¶å¤§å°åçäºååå¢ï¼æ¯ä¸ª `Segment` 齿ä¸ä¸ª `modCount` åéï¼æ¯å½è¿è¡ä¸æ¬¡ `put remove` çæä½ï¼`modCount` å°ä¼ +1ãåªè¦ `modCount` åçäºåå就认为容å¨ç大å°ä¹å¨åçååã