当前位置: 首页 > 网络应用技术

contrenthashmap如何保证线程安全性?

时间:2023-03-08 16:35:33 网络应用技术

  ConcurRentHashMap等效于Hashmap的多线程版本。它的功能与HashMap没有什么不同。由于哈希图在同时操作过程中将存在各种问题,例如死周期问题,数据覆盖范围和其他问题。只要使用Concurrenhashmap,这些问题就可以完美地解决。ConcurRentHashMap是否确保线程安全?

  1. JDK1.7实施原则首先,让我们看一下JDK 1.7中Concurrenthashmap的基础结构。它基本上是使用阵列加上列表的形式来延续哈希图的设计。

  大树组段可以理解为数据库,每个数据库(段)都有许多平板电脑,并且每个哈希中都有许多数据。这些数据是通过链接列表连接的。了解ConturnThashMap的基本结构设计后,让我们看一下其线程安全实现,它相对简单。

  接下来,让我们比较jdk1.7中contrenthashmap的put()方法的port()方法源代码。

  因为段本身基于重新输入重新输入的锁定锁和释放锁,因此当多个线程同时访问confurnthashmap时,只有一个线程可以同时操作相应的节点,从而确保confurrenthashmap。线程是安全的。

  换句话说,ConcurRentHashMap的线程安全性基于段锁,因此我们称其为段锁或片段锁,如图所示。

  JDK1.8如何实现?

  2. JDK1.8 JDK1.7中的优化内容,尽管ConsturrentHashMap是线程-SAFE,因为其基本实现是在更多数据的情况下以链接列表的形式形式将减少对访问的访问。在JDK1.8之后,具有链接列表加红色和黑树的数组方法优化了ConcurrenthashMap的实现,图中显示了特定的实现。

  当链接列表的长度大于8并且数组的长度大于64时,链接列表将升级到红色和黑树的结构。尽管JDK中的ConsurrentHashMap 1.8保留了段的定义,此只是为了确保序列化的兼容性,并且不再有任何结构。

  JDK 1.8中的confurrenthashmap的源代码如何实现?它主要使用CAS和挥发性或同步以确保线程安全性。

  我们可以从源代码片段中看到,在添加元素时,我们将首先确定容器是否为空。

  如果是空的,请使用挥发性和CAS初始化,

  如果容器不为空,请根据存储元素计算位置是否为空。

  如果存储元件的计算结果为空,则节点由CAS设置;

  如果根据存储元素为空或空为空,请使用同步,然后在存储桶中遍历数据,然后在桶中替换或添加新节点。

  最终判断它是否需要变成红树和黑树。这可以确保并发访问期间线程的安全性。

  如果以一句话总结了上述执行,则相当于contrenthashmap,以确保线程通过锁定头部节点安全。

  该设计的优点是,锁的大小小于片段,哈希冲突和锁的频率发生,并且同时场景的运行性能也有所改善。此外,当数据量相对较大时,,查询性能也得到了极大的改进。

  2.总结,最后,让我们总结:

  1. JDK 1.7中使用的数组加上链接的链结构分为两类。大树组细分市场和小阵列已形成。

  2. ConcurRentHashMap使用数组加上链接列表以及JDK1.8中的红色和黑树。它可以通过CAS或同步确保线程安全性,并降低锁的粒径,并且查询性能也更高。

  Concurrenthashmap中有许多设计思想值得我们学习和参考,例如锁定的粒度控制,细分市场锁的设计等,可以应用于实际的业务开发场景。通过学习这些基本原则来设计思想,以帮助我们更有效地解决实际问题。

  好吧,让我们谈谈共享concurrenthashmap的共享。您可以关注理解的朋友,下次不会迷路。

  本文最初是创建“ Tom Bullet Architecture”的。请指出重印的来源。技术在于共享,我分享我的幸福!如果本文对您有所帮助,请注意并喜欢;如果您有任何建议,也可以发表评论或私人消息。您的支持是我坚持创建的动力。关注微信公共帐户“ Tom Bullet Architecture”以获取更多技术干货!

  原始:https://juejin.cn/post/7097046521794789412