首页
学习
活动
专区
圈层
工具
发布

Java8 ConcurrentHashMap源码解析

JDK 1.8 ConcurrentHashMap存储示意图 可以发现 JDK1.8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,不再是之前的 Segment 数组 +...当为0时:代表当时的table还没有被初始化 *当为正数时:表示初始化或者下一次进行扩容的大小*/ private transient volatile int sizeCtl; 从源码中可以发现 ConcurrentHashMap...TreeBin(hd)); } } } } } 到第六步表示已经数据加入成功了,现在调用addCount()方法计算ConcurrentHashMap...我们现在要回到开始的例子中,我们对个人信息进行了新增之后,我们要获取所新增的信息,使用String name = map.get(“name”)获取新增的name信息,现在我们依旧用debug的方式来分析下ConcurrentHashMap...= null && key.equals(ek)))) return e.val; } } return null; } ConcurrentHashMap

48610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java8的ConcurrentHashMap为何放弃分段锁

    今天突然被一个同事问到java8为何放弃分段锁,于是花了点时间针对这个问题进行了小小的总结。...jdk1.7分段锁的实现 和hashmap一样,在jdk1.7中ConcurrentHashMap的底层数据结构是数组加链表。...和hashmap不同的是ConcurrentHashMap中存放的数据是一段段的,即由多个Segment(段)组成的。每个Segment中都有着类似于数组加链表的结构。...并发级别,默认16 其中并发级别控制了Segment的个数,在一个ConcurrentHashMap创建后Segment的个数是不能变的,扩容过程过改变的是每个Segment的大小。...当数组大小已经超过64并且链表中的元素个数超过默认设定(8个)时,将链表转化为红黑树 ConcurrentHashMap的put操作代码如下: ? 把数组中的每个元素看成一个桶。

    19.1K42

    理解Java8并发工具类ConcurrentHashMap的实现

    Map: HashMap (允许key和value都为null) TreeMap (允许value为null) LinkedHashMap (允许key和value都为null) 线程安全的Map: ConcurrentHashMap...在JDK7中的ConcurrentHashMap采用了分段锁的技术,每个段类似一个独立的数组+链表结构,并发粒度控制在Segment级别,如下图: ?...前面说过JDK8的ConcurrentHashMap用了数组+链表+红黑树的数据结构,如下图: ?...deletion boolean red; //....... } TreeBin封装了TreeNode,当链表转树时,用于封装TreeNode,也就是说,ConcurrentHashMap...总结: 本文主要介绍了Java8里面HashMap的相关内容并着重介绍了ConcurrentHashMap的实现和核心方法分析,HashMap是我们日常开发中使用频率最高的类之一,而ConcurrentHashMap

    1.1K20

    为并发而生的 ConcurrentHashMap,基于 Java8 分析

    本篇文章将要介绍的 ConcurrentHashMap 是 HashMap 的并发版本,它是线程安全的,并且在高并发的情境下,性能优于 HashMap 很多。...本篇主要介绍 1.8 版本的 ConcurrentHashMap 的具体实现。...三、put 方法实现并发添加 对于 HashMap 来说,多线程并发添加元素会导致数据丢失等并发问题,那么 ConcurrentHashMap 又是如何做到并发添加的呢?...五、其他的一些常用方法的基本介绍 最后我们在补充一些 ConcurrentHashMap 中的小而常用的方法的介绍。 1、size size 方法的作用是为我们返回哈希表中实际存在的键值对的总数。...= null) sum += a.value; } } return sum; } 可能你会有所疑问,ConcurrentHashMap

    52410

    ConcurrentHashMap源码(二)

    return sum; } (1)元素的个数依据不同的线程存在在不同的段里; (2)计算CounterCell所有段及baseCount的数量之和; (3)获取元素个数没有加锁; 总结 (1)ConcurrentHashMap...是HashMap的线程安全版本; (2)ConcurrentHashMap采用(数组 + 链表 + 红黑树)的结构存储元素; (3)ConcurrentHashMap相比于同样线程安全的HashTable...,效率要高很多; (4)ConcurrentHashMap采用的锁有 synchronized,CAS,自旋锁,分段锁,volatile等; (5)ConcurrentHashMap中没有threshold...元素个数的更新如果还是出现多个线程同时更新一个段,则会扩容段(CounterCell); (17)获取元素个数是把所有的段(包括baseCount和CounterCell)相加起来得到的; (18)查询操作是不会加锁的,所以ConcurrentHashMap...不是强一致性的; (19)ConcurrentHashMap中不能存储key或value为null的元素; ConcurrentHashMap中有哪些值得学习的技术呢?

    81220

    ConcurrentHashMap 源码解读

    前言 ConcurrentHashMap是线程安全的集合实现。在高并发下,ConcurrentHashMap能保证内部的每个方法都是原子性的!...注:本片文章所涉及的源码版本来自 JDK1.8 Java 8 几乎完全重写了 ConcurrentHashMap,代码量从原来 Java 7 中的 1000 多行,变成了现在的 6000 多行 ConcurrentHashMap...构造方法 当我们调用无参构造时 ConcurrentHashMap map = new ConcurrentHashMap(); 默认会创建大小为 16 的空集合 当我们调用构造方法并手动设置集合大小时...ConcurrentHashMap map = new ConcurrentHashMap(12); 源码如下 /** * 创建一个新的空集合,其初始大小可容纳指定数量的元素,而无需动态调整大小 *...但是Segment的个数一但初始化就不能改变 Java8 中的ConcurrentHashMap使用的Synchronized 锁加 CAS 的机制。

    17210

    Java集合:ConcurrentHashMap

    本篇内容包括:ConcurrentHashMap 概述、ConcurrentHashMap 底层数据结构、ConcurrentHashMap 的使用以及相关知识点。...一、ConcurrentHashMap 概述 ConcurrentHashMap 是 HashMap 的线程安全版本,其内部和 HashMap 一样,也是采用了数组 + 链表 + 红黑树的方式来实现。...ConcurrentHashMap 主要就是为了应对 HashMap 在并发环境下不安全而诞生的,ConcurrentHashMap 大量的利用了 volatile,final,CAS 等 lock-free...ConcurrentHashMap 避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度 在 Jdk1.7 中 ConcurrentHashMap 采用了 数组+Segment+分段锁...() 无参构造 public ConcurrentHashMap(int initialCapacity) 指定初始容量 public ConcurrentHashMap(Map<?

    84620
    领券