Skip to content

HashMap和ConcurrentHashMap 注意点

kylodw edited this page Mar 25, 2019 · 1 revision

在多线程模式下,HashMap的put操作会造成死循环,HashMap的Entry链表形成环形数据结构,Entry的next节点永远不为空。

ConcurrentHashMap

  1. ConcurrentHashMap使用了锁分段技术有效提高了并发访问率。

  2. HashMap扩容判断为:插入元素后才判断是否达到容量,需要扩容,创建一个容量为原来容量的两倍的数组,然后将原数组中的元素再散列插入新数组。

  3. ConcurrentHashMap扩容判断(threshold),插入元素前判断segment的HashEntry数组是否需要扩容,扩容只对某个segment进行扩容。

  4. 通过锁分段技术保证并发环境下的写操作;

  5. 通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;

  6. 通过不加锁和加锁两种方案控制跨段操作的的安全性。

读操作不需要加锁的奥秘在于以下三点:

  • 用HashEntery对象的不变性来降低读操作对加锁的需求;
  • 用Volatile变量协调读写线程间的内存可见性;
  • 若读时发生指令重排序现象,则加锁重读;