ConcurrentHashMap在jdk1.7和jdk1.8的不同

对比Java7 和Java8 的异同和优缺点
数据结构
Java 7 采用 Segment 分段锁来实现,而 Java 8 中的 ConcurrentHashMap 使用数组 + 链表 + 红黑树,在这一点上它们的差别非常大。

并发度
Java 7 中,每个 Segment 独立加锁,最大并发个数就是 Segment 的个数,默认是 16。

但是到了 Java 8 中,锁粒度更细,理想情况下 table 数组元素的个数(也就是数组长度)就是其支持并发的最大个数,并发度比之前有提高。

保证并发安全的原理
Java 7 采用 Segment 分段锁来保证安全,而 Segment 是继承自 ReentrantLock。

Java 8 中放弃了 Segment 的设计,采用 Node + CAS + synchronized 保证线程安全。

遇到 Hash 碰撞
Java 7 在 Hash 冲突时,会使用拉链法,也就是链表的形式。

Java 8 先使用拉链法,在链表长度超过一定阈值时,将链表转换为红黑树,来提高查找效率。

查询时间复杂度
Java 7 遍历链表的时间复杂度是 O(n),n 为链表长度。

Java 8 如果变成遍历红黑树,那么时间复杂度降低为 O(log(n)),n 为树的节点个数。

### JDK 1.7 JDK 1.8ConcurrentHashMap区别 #### 数据结构变化 在 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` 表现出更好的扩展性更低延迟特性。特别是在多核处理器环境中运行大型应用程序时优势明显,测试结果显示其吞吐量远高于旧版实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值