-
Notifications
You must be signed in to change notification settings - Fork 0
HashMap和ConcurrentHashMap 注意点
kylodw edited this page Mar 25, 2019
·
1 revision
在多线程模式下,HashMap的put操作会造成死循环,HashMap的Entry链表形成环形数据结构,Entry的next节点永远不为空。
-
ConcurrentHashMap使用了锁分段技术有效提高了并发访问率。
-
HashMap扩容判断为:插入元素后才判断是否达到容量,需要扩容,创建一个容量为原来容量的两倍的数组,然后将原数组中的元素再散列插入新数组。
-
ConcurrentHashMap扩容判断(threshold),插入元素前判断segment的HashEntry数组是否需要扩容,扩容只对某个segment进行扩容。
-
通过锁分段技术保证并发环境下的写操作;
-
通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;
-
通过不加锁和加锁两种方案控制跨段操作的的安全性。
- 用HashEntery对象的不变性来降低读操作对加锁的需求;
- 用Volatile变量协调读写线程间的内存可见性;
- 若读时发生指令重排序现象,则加锁重读;