ConcurrentHashMap
一、引入背景(Why) 1. 在多线程环境下,HashMap的put会导致扩容,扩容引起死循环,导致CPU使用率100% 2. 可以使用HashTable和Collections.synchronizedMap(hashMap)可以解决多线程的问题 3. HashTable和Collections.synchronizedMap(hashMap)对读写进行加一个 全局锁 ,一个线程读写map的元素,其余线程必须等待,性能不好 4. ConcurrentHashMap也加了锁,但是只锁了map的一部分,其余线程可以继续读写没锁住的部分,优化了操作性能 二、JDK1.7的实现(了解):Segment分段锁+HashEntry+ReentrantLock 1. HashEntry是键值对,用来存储数据 2. 桶是由若干个HashEntry连接起来的链表 3. Segment分段锁继承ReentrantLock,每个Segment对象锁住若干个桶 4. 一个ConcurrentHashMap实例中,包含由若干个Segment对象组成的数组 5. HashEntry->HashBucket->Segment->ConcurrentHashMap,一层一层被包含 三、JDK1.8的实现(理解):Node+CAS+Synchronized,锁的粒度更小 1. 数据结构