ConcurrentHashMap在JDK1.7与1.8有什么差别???

简介: ConcurrentHashMap在JDK1.7与1.8有什么差别???

一、JDK1.7


数据结构: ReentrantLock+Segment+HashEntry, - 个Segment中包含一个HashEntry数组, 每个HashEntry又是一个链表结构

**元素查询:**二 二次hash,第-次Hash定位到Segment, 第二次Hash定位到元素所在的链表的头部

锁: Segment分段锁Segment继承了ReentrantLock,锁定操作的Segment,其他的Segment不受影响,并发度为segment个数,可以通过构造函数指定,数组扩容不会影响其他的segment

get方法无需加锁,volatile保证


二、JDK1.8:


数据结构: synchronized+CAS+Node+红黑树, Node的val和next都用volatile修饰, 保证可见性

查找,替换,赋值操作都使用CAS

**锁:**锁链表的head节点,不影响其他元素的读写,锁粒度更细,效率更高,扩容时,阻塞所有的读写操作、并发

扩容

读操作无锁:

Node的val和next使用volatile修饰,读写线程对该变量互相可见

数组用volatile修饰,保证扩容时被读线程感知

目录
相关文章
|
存储 安全 Java
ConcurrentHashMap底层实现原理
ConcurrentHashMap底层实现原理
827 0
|
8月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1242 0
|
存储 安全 Java
最爱问的高频ConcurrentHashMap原理,你会了吗?
ConcurrentHashMap 是 Java 中的线程安全散列表实现,允许多个线程同时访问和修改数据。它在 JDK 1.7 中通过分段锁机制将 HashMap 分为多个段,每个段使用独立的锁来保证线程安全;而在 JDK 1.8 中则采用 CAS 和 synchronized 结合的方式,提高了并发性能。与 HashMap 相比,ConcurrentHashMap 是线程安全的,支持更高的并发性能,且不支持 null 键和值。CAS(Compare-and-Swap)是一种无锁原子操作,用于确保多线程环境下的数据一致性,避免竞态条件。
680 5
|
消息中间件 运维 算法
Kafka 为什么要抛弃 Zookeeper?
本文探讨了Kafka为何逐步淘汰ZooKeeper。长久以来,ZooKeeper作为Kafka的核心组件,负责集群管理和协调任务。然而,随着Kafka的发展,ZooKeeper带来的复杂性增加、性能瓶颈及一致性问题日益凸显。为解决这些问题,Kafka引入了KRaft,这是一种基于Raft算法的内置元数据管理方案,不仅简化了部署流程,还提升了系统的一致性和扩展性。本文详细分析了这一转变背后的原因及其带来的优势,并展望了Kafka未来的发展方向。
976 1
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
2486 25
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
存储 安全 Java
ConcurrentHashMap的存储结构是怎样的
在Java并发编程中,ConcurrentHashMap是一个非常重要的数据结构,它提供了一种线程安全的哈希表实现。本文将深入探讨ConcurrentHashMap的底层存储结构,揭示其如何通过数组、链表和红黑树的结合来优化性能。
|
存储 安全 Java
AQS为什么采用双向链表
AQS为什么采用双向链表
416 10
|
缓存 移动开发 网络协议
为什么会TCP粘包?读完这篇你就懂了
在网络编程中,TCP粘包问题指发送方多个数据包在接收方粘成一包,导致数据解析混乱。其原因包括Nagle算法合并小包、发送方收集多个小分组及接收方缓存积压等。解决方法有:固定消息长度、包尾加特殊标记(如\r\n)、包头加包体长度等。选择合适方案可确保数据传输的可靠性和准确性。

热门文章

最新文章