IT袋

当前位置:主页 > 经验教程 > 建站编程 >

ConcurrenHashmap怎么实现线程安全

ConcurrenHashmap怎么实现线程安全?

时间:2024-03-22 12:00:16 来源:IT袋 作者:马勇
导读:ConcurrenHashmap怎么实现线程安全,本文核心导读:ConcurrenHashmap怎么实现线程安全的介绍,下面小编为您详细解答 JDK 1.7 ConcurrentHashMap 在 JDK 1.7 中它使用的是数组加链表的形式实现的,而数组又分为:大数

ConcurrenHashmap怎么实现线程安全

本文核心导读:ConcurrenHashmap怎么实现线程安全的介绍,下面小编为您详细解答

JDK 1.7 ConcurrentHashMap

在 JDK 1.7 中它使用的是数组加链表的形式实现的,而数组又分为:大数组 Segment 和小数组 HashEntry。

Segment 是一种可重入锁(ReentrantLock),在 ConcurrentHashMap 里扮演锁的角色;HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素。

ConcurrenHashmap怎么实现线程安全

JDK 1.7 ConcurrentHashMap 分段锁技术将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。

JDK 1.8 ConcurrentHashMap

在 JDK 1.7 中,ConcurrentHashMap 虽然是线程安全的,但因为它的底层实现是数组 + 链表的形式,所以在数据比较多的情况下访问是很慢的,因为要遍历整个链表,而 JDK 1.8 则使用了数组 + 链表/红黑树的方式优化了 ConcurrentHashMap 的实现,具体实现结构如下:

ConcurrenHashmap怎么实现线程安全

JDK 1.8 ConcurrentHashMap JDK 1.8 ConcurrentHashMap 主要通过 volatile + CAS 或者 synchronized 来实现的线程安全的。添加元素时首先会判断容器是否为空:

  • 如果为空则使用 volatile 加 CAS 来初始化
  • 如果容器不为空,则根据存储的元素计算该位置是否为空。
    • 如果根据存储的元素计算结果为空,则利用 CAS 设置该节点;
    • 如果根据存储的元素计算结果不为空,则使用 synchronized ,然后,遍历桶中的数据,并替换或新增节点到桶中,最后再判断是否需要转为红黑树,这样就能保证并发访问时的线程安全了。

如果把上面的执行用一句话归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了。

而且 JDK 1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn) 的时间复杂度。

本文分享的ConcurrenHashmap怎么实现线程安全?的经验介绍,您知道和解决您袋问题了吗?

相关阅读

  • 多级缓存设计和实战应用 多级缓存的设计与应用

    多级缓存设计和实战应用 多级缓存的设计与应用

    为网友解答多级缓存设计和实战应用方面的讲解,接下来就是全面介绍。 生活场景 星期天的上午,布布和一二在家里畅谈人生,突然觉得生活太乏味,一二提出要去吃一碗新鲜的麻辣烫。 于

  • 什么是Git远程分支?如何从GitHub查看远程分支?

    什么是Git远程分支?如何从GitHub查看远程分支?

    本文核心内容:什么是Git远程分支的相关知识,一起来了解了解吧。 Git 是一个免费的开源工具。具体来说,它是当今软件开发中最流行的版本控制系统。 Git 允许你跟踪和维护一个编程项目的

  • 香港BGP服务器丢包率高与什么有关? 服务器丢包的原因有哪些

    香港BGP服务器丢包率高与什么有关? 服务器丢包的原因有哪些

    相对于大多数人香港BGP服务器丢包率高与什么有关的内容,接下来一起来看看吧。 当前,BGP线的香港机房比较普及,假设用户所在机房不是BGP机房,而是联通或电信等其他机房,这时当用户通

  • es常见分词器有哪些

    es常见分词器有哪些

    一个电脑小知识,为大家介绍es常见分词器有哪些的内容,一定能解决您的问题的,一起来了解吧! 常见的分词器如下: standard 默认分词器,对单个字符进行切分,查全率高,准确度较低 IK