CurrentHashMap 中采用分段加锁,扩容操作也是针对某个segment,segment 是继承 Reentrantlock 来实现并发安全的。put操作的逻辑是这样的,首先需要找到Segment数组中的索引来找到该(key,value)应该放到哪个Segment 中,注意segment不存在的时候需要创建,这时候就需要cas 来保证只有一个线程来创建,其他线程使用这个线程创建好的Segment.拿到segment后需要put 到其正确的HashEntry[]数组中的某个位置上,这时候需要进行加锁,加锁有阻塞式和非阻塞式 即tryLock() 和 lock() ,然后进行头插法插入。 插入的过程需要考虑扩容,doug len 进行了细节上的优化,比如对尾部节点的同属一个位置的结点 进行整体迁移。
CurrentHashMap 中大量使用了unsafe类的对于内存 和对象的操作以及cas的操作。
重要的字段 concurrentLevel 并发级别默认是16 (为2 的幂次方)并发水平重要度量
其实Segment 才相当于HashMap 其继承了ReentrantLock 并包含了负载因子、容量 、大小等 属性。