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

ConcurRenthAshMap源代码分析(超详细版本)

时间:2023-03-09 14:03:18 网络应用技术

  ConcurRentHashMap是Hashmap的线程安全版本,该版本在JUC软件包中提供。使用挥发性关键字和CAS和同步关键字来转换哈希图以使其安全。其特性与HashMap相同。Hashmap的源代码可以看到我以前的博客:https://www.shouxicto.com/article/129.html

  但是,Hashmap的差异不仅是线程安全性,而且confurrenthashmap不允许键和值为空。这也可以在以后的源分析中看到。当您提到它时,您将不会详细分析源代码。

  您必须首先了解他的体系结构,包括框架,以便我们可以拥有一个整体框架,并且更容易学习。以下两张图片是从其他人的博客中挑选的(PS:我觉得许多博客是这两张图片,所以我不表示来源,我:让您0.0)

  1.8:

  1.7:

  如图所示,在版本1.8之后,ConfurrentHashMap和Hashmap的数据结构基本相同。唯一的区别是,在操作链接列表或红色和黑色树时,ConsurrentHashMap锁定在节点数组中的链接列表中或红色和黑色树中。确保线程同步。并使用挥发性关键字来确保表格阵列的可见性,标准索引等与CAS相结合,以确保线程同步而无需锁定。与1.7相比,它还引入红树和黑树以极大地优化速度。

  在版本1.7之前,ConcurRentHashMap使用分段锁将条目数组分为多个段数组。然后,当我们插入数据时,该段就被锁定了,这比Hashtable的整个锁定速度快得多,并且可以做到。

  GET方法相对简单。与PUT方法相比,我们只需要使用Valotile关键字来确保可见性,因此与Hashmap没有太大不同

  在阅读此获取源代码之前,我们需要知道一种方法,该方法也用于PUT。我们需要了解他在做什么:

  该代码主要用于在表数组中使用相应的设置元素。您可以看到调用了getObjectVolatile()方法。此方法是USAFE类提供的一种方法。该课程提供了一些原子操作。它是通过我们通过我们通过我们的。

  然后是传播方法。您可以看到这与我们的hashmap中的hash()方法相同,但是使用hash_bits执行。正数代表链接列表。如果是1,则为负,代表红树和黑色树。以后判断红树和黑树时,将使用此方法。

  然后,我们查看GET的源代码:

  首先,我们计算传递键的哈希值()方法。

  在这一点上,GET方法已经结束。

  PUT方法相对麻烦,代码如下:

  putval()方法在此处调用,该方法是指重复PUT值时是否替换它。false代表替换。然后我们查看putval()方法:

  让我们看一下此addCount()方法:

  X参数表示表中的元素数量。检查参数指示是否执行容量扩展检查,该检查需要超过或等于0,并且我们的Putval方法的Bincount参数的最小值也为0。将检查元素。(除非涵盖),否则以下是一个详细的步骤:

  在这一点上,我们的PUT方法已经结束。

  同步机制锁定,每个段都继承了重新输入锁定+同步保证并发更新数据结构阵列+链接列表+链接列表+红色和黑色树节点hashntrynodeput多个线程以同一时间获得相同的段锁定,请获得成功的线程更新映射;故障线程尝试多次获得锁定仍然不成功,然后悬挂该线程,等待相应的存储桶的释放,使用Sychronized关键字来防止多个线程同时操作同一存储桶。如果节点的哈希不小于0,它将标识链接列表更新节点或插入新节点。如果节点是树木类型节点,表明它是红色和黑色的树结构,则通过Puttreeval方法将节点插入红色和黑树中;与hashmap相比,黑色树concurrenthashmap更为复杂,因为整体,由于同时发生的高度,因此更难理解。本文仅分析了看台并详细获取方法。其他方法相对简单。想知道的朋友可以自己检查源代码。此外,这次的源代码分析中存在错误,欢迎纠正我,谢谢。