当前位置: 首页 > 面试题库 >

ConcurrentHashMap线程安全的具体实现方式? 底层具体实现原理?

马胜泫
2023-03-14
本文向大家介绍ConcurrentHashMap线程安全的具体实现方式? 底层具体实现原理?相关面试题,主要包含被问及ConcurrentHashMap线程安全的具体实现方式? 底层具体实现原理?时的应答技巧和注意事项,需要的朋友参考一下

JDK1.7的ConcurrentHashMap:


首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成

Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。

java static class Segment extends ReentrantLock implements Serializable { }

一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。

JDK1.8的ConcurrentHashMap


ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(log(N)))

synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

 类似资料:
  • 本文向大家介绍JS的全排列具体实现?相关面试题,主要包含被问及JS的全排列具体实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:  

  • 主要内容:1 索引的数据结构,2 B-Tree索引的介绍,2.1 为什么选择B-Tree结构,2.2 B+Tree和B-Tree结构的区别,3 MyISAM的BTREE索引实现,4 InnoDB的BTREE索引实现,4.1 ROWID,5 B-Tree索引的有效查询类型深入解析了Mysql的B+Tree索引底层数据结构,以及MyISAM和InnoDB 存储引擎的索引底层原理。 下面我们来看看常见的索引结构的底层实现原理。包括B-Tree、B+Tree的数据结构,以及MyISAM和InnoDB 存

  • Docker 底层的核心技术包括 Linux 上的命名空间(Namespaces)、控制组(Control groups)、Union 文件系统(Union file systems)和容器格式(Container format)。 我们知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。这

  • 1、基本架构 Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。 Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行

  • 本文向大家介绍promise的定义与 的具体实现?相关面试题,主要包含被问及promise的定义与 的具体实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:   Promise对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。 f1().then(f2); 一个promise可能

  • 我是java字节编码的新手,我已经在这个问题上挣扎了一段时间。我使用的是java ASM字节码工程库。我希望找到特定方法调用的实现这些方法的所有方法和类。被调用方法的名称和说明,以及实现被调用方法的类的名称。问题是,当被分析的方法调用接口或抽象类中定义的方法时,我找不到实际实现被调用方法的具体类的名称。这里也是我的一些代码和测试输出,可视化的情况。 和输出: