- 概念
ConcurrentHashMap实现了Map接口,和HashMap一样,使用K,V形式存储数据,只不过它是线程安全的,不允许有空键空值。 - 扩容
默认容量是16,达到容量的0.75时,容量会扩大一倍。 - jdk1.7如何保证线程安全
jdk1.7中,ConcurrentHashMap采用Segment(数组段)+HashEntry数组+链表实现,每个Segment包含多个HashEntry,HashEntry又是一个链表。Segement在实现上继承了ReentrantLockLock,这样实现分段锁。这样做有2个缺点:
1.锁的力度有点儿粗;
2.需要进行两次hash操作, 第一次通过hash值和段数组长度-1计算key落在哪个数组段,第二次通过hash值和table数组长度-1计算落在哪个位置。 - jdk1.8如何保证线程安全
jdk1.8取消了分段锁,采用了CAS+Synchronized来实现,当数组长度达到64,链表超度超过8时,会将单向链表转换成红黑树结构。 - 高位迁移原理(1.8后)
计算存储位置公示:(n-1)&hash,扩容后,有些key在扩容前后hash得到位置发生了变化,需要迁移,位置没变不需要迁移。高位迁移,低位不变。
ConcurrentHashMap浅析
于 2023-07-20 16:49:19 首次发布