JDK 1.7ConcurrentHashMap 的理解

CurrentHashMap 中采用分段加锁,扩容操作也是针对某个segment,segment 是继承 Reentrantlock 来实现并发安全的。put操作的逻辑是这样的,首先需要找到Segment数组中的索引来找到该(key,value)应该放到哪个Segment 中,注意segment不存在的时候需要创建,这时候就需要cas 来保证只有一个线程来创建,其他线程使用这个线程创建好的Segment.拿到segment后需要put 到其正确的HashEntry[]数组中的某个位置上,这时候需要进行加锁,加锁有阻塞式和非阻塞式 即tryLock() 和 lock() ,然后进行头插法插入。 插入的过程需要考虑扩容,doug len 进行了细节上的优化,比如对尾部节点的同属一个位置的结点 进行整体迁移。

CurrentHashMap 中大量使用了unsafe类的对于内存 和对象的操作以及cas的操作。

重要的字段 concurrentLevel 并发级别默认是16 (为2 的幂次方)并发水平重要度量
其实Segment 才相当于HashMap 其继承了ReentrantLock 并包含了负载因子、容量 、大小等 属性。

### JDK 1.7JDK 1.8 中 ConcurrentHashMap 的区别 #### 数据结构变化 在 JDK 1.7 版本中,`ConcurrentHashMap` 使用分段锁定机制来提高并发性能。整个哈希表被分割成多个独立的部分(Segment),每个 Segment 类似于一个小型的 HashMap,并且有自己独立的锁。这使得不同部分可以并行访问而不会相互阻塞。 而在 JDK 1.8 及之后版本里,为了进一步提升性能和减少内存占用,引入了一种新的设计——基于 CAS (Compare And Swap) 操作以及链表转红黑树优化策略。当桶内元素数量超过一定阈值时会自动转换为红黑树形式存储键值对,从而提高了查找速度[^4]。 #### 锁粒度调整 由于采用了更细粒度的数据分区方式,在处理高并发场景下能够显著降低争用率;同时通过无锁算法实现了大部分操作无需加锁即可完成,特别是对于只读请求来说几乎不存在同步开销问题[^2]。 ```java // JDK 1.7 示例代码片段 public V get(Object key) { int hash = hash(key); Segment<K,V> s = segmentFor(hash); // 获取对应的segment对象 return s.get(key, hash); // 调用segment内部方法获取value } // JDK 1.8 示例代码片段 final V doGet(Object key, int hash) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; if ((tab = table) != null && (n = tab.length) > 0 && (e = tab[(n - 1) & hash]) != null) { ... } } ``` #### 性能改进 随着新架构的应用,JDK 1.8 下 `ConcurrentHashMap` 表现出更好的扩展性和更低延迟特性。特别是在多核处理器环境中运行大型应用程序时优势明显,测试结果显示其吞吐量远高于旧版实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值