ConCurrentHashMap原理
2023-12-28 19:30:19 0 举报
ConCurrentHashMap是一种线程安全的哈希表实现,用于在多线程环境中高效地存储键值对。它通过使用分段锁(Segment)机制来实现并发控制。每个Segment都是一个独立的锁,可以同时支持多个线程进行读和写操作。在插入和删除元素时,首先需要获取相应Segment的锁,这样可以保证同一时间只有一个线程可以对Segment内部的HashMap进行操作。同时,ConCurrentHashMap还采用了懒惰初始化、避免热点域等问题的优化策略,以提高性能。在Java 8中,ConCurrentHashMap进行了重大改进,采用Node数组+链表+红黑树的数据结构,提高了查询和插入的性能。
作者其他创作
大纲/内容
是否是ReservationNode对象类型
Y
说明是链表
ConCurrenthashmap不允许key或者value为Null
N
退出循环
执行插入Node对象到链表尾部
继续下次循环
执行addCount方法决定是否扩容
执行初始化
原理和put一样,也是对链表头部加锁进行操作
开始下次循环
table是否被初始化(是否第一次执行put)
该下标下的对象是否是Null
拿到数组该下标下的Node对象
new ConCurrentHashMap()
成功?
get
通过CAS来插入新Node对象
插入节点对象到树中
开始使用synchroized加锁
判断当前Node对象hash值是否大于等于0
扩容仍然只有put时候会触发扩容
结束循环
remove
实例化时候和hashMap 一样
[死循环]
Loop
比较简单,和Has和Map一样
使用CAS来保证多线程安全
抛出异常
判断key或者value是否是Null
说明当前没有对象,可以生成对象并插入
说明当前其他线程正在扩容
这里锁住的是数组中的Node对象链表中的头对象,这样可以保证该位置链表或树操作的线程安全
释放锁
抛出空指针异常
说明是红黑树
判断当前Node对象是否是Tree对象
通过Spread方法获取到key的hash值
调用方法helpTransfer协助扩容
判断该Node对象的hash值是否等于MOVE
计算出当前元素在数组中的下标
put
0 条评论
下一页