ConcurrentHashMap是线程安全的HashMap,并非通过锁住整个方法,而是在方法内进行一些原子的操作和局部加锁保证多线程的安全
一些些随机
ConcurrentHashMap 内部是以Node形式来存储的
transient volatile Node<K,V>[] table;
这里使用volatile也是保证了可见性和禁止重排序
在ConcurrentHashMap的pu方法中会使用CAS来保证原子性
在1.7和1.8中的扩容实现
ConcurrentHashMap的数据结构如下:
ConcurrentHashMap的扩容方式如下:
1.8
数据结构:
在JDK 1.8中,ConcurrentHashMap的内部数据结构发生了重大改变。JDK 1.7中的分段锁机制被替换为基于CAS(Compare and Swap)操作的Node数组和红黑树结构,以提供更好的并发性能和可扩展性。
数组:ConcurrentHashMap使用一个Node数组来存储键值对。每个数组中的元素称为Node节点。每个节点包含了键、值、哈希值,以及指向下一个节点的引用。
链表和红黑树:JDK 1.8中的ConcurrentHashMap使用了链表和红黑树来解决哈希冲突的问题。当链表的长度达到一定阈值(默认为8)时,链表会自动转换为红黑树,以提高查找和删除操作的效率。
扩容方式:
JDK 1.8中的ConcurrentHashMap使用了一种优化的扩容方式,被称为树化分割(TreeNode splitting)。
初始容量:和JDK 1.7一样,ConcurrentHashMap在初始化时会创建一个固定大小的Node数组,长度为16。
扩容阈值:JDK 1.8中的ConcurrentHashMap的扩容阈值相较于JDK 1.7有所不同。扩容阈值设置为容量的3/4,并且在每次扩容后会翻倍。也就是说,当哈希表的节点数量达到阈值时就会触发扩容操作。
扩容过程:当哈希表需要扩容时,JDK 1.8中的ConcurrentHashMap采用了树化分割的方式。
通过树化分割的方式,JDK 1.8中的ConcurrentHashMap在进行扩容时可以更高效地转移数据,并提供更好的并发性能。此外,JDK 1.8中的ConcurrentHashMap还引入了一些改进,如在读操作上引入了乐观锁机制,以进一步提高并发性能。