学习
实践
活动
工具
TVP
写文章

ConcurrentHashMap详解

www.jianshu.com/p/c0642afe03e0 http://www.cnblogs.com/huaizuo/archive/2016/04/20/5413069.html 在jdk1.6中ConcurrentHashMap 改进一:取消segments字段,直接采用transient volatile HashEntry 一、构造函数: public ConcurrentHashMap(int initialCapacity

76930

ConcurrentHashMap学习

ConcurrentHashMap学习 属性 //最大容量 2的30次方 private static final int MAXIMUM_CAPACITY = 1 << 30; //初始容量 private static final int DEFAULT_CAPACITY = 16; /** * 虚拟机限制的最大数组长度,在ArrayList中有说过,jdk1.8新引入的, * ConcurrentHashMap transient ValuesView<K,V> values; private transient EntrySetView<K,V> entrySet; 构造函数 //默认无参构造函数 public ConcurrentHashMap () { } public ConcurrentHashMap(int initialCapacity) { //初始容量小于0,则抛出异常 if (initialCapacity > m) { this.sizeCtl = DEFAULT_CAPACITY; putAll(m); } //指定初始容量和负载因子 public ConcurrentHashMap

9730
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

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

    HashMap & ConcurrentHashMap

    HashMap底层原理是: 数组 + 链表 当链表长度大于8时 即链表长度等于9,链表结构就会转换为红黑树

    10520

    ConcurrentHashMap总结

    s.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 三、ConcurrentHashMap 下面简单分析ConcurrentHashMap的实现,相当精巧。 默认一个ConcurrentHashMap中有16个子HashMap,所以相当于一个二级哈希。 迭代操作: ConcurrentHashMap的历遍是从后向前历遍的,因为如果有另一个线程B在执行clear操作时,会把table中的所有slot都置为null,这个操作是从前向后执行 如果线程A在历遍 entrySet()){ System.out.println("key:" + entry.getKey()); } HashMap输出的是 key:1 key:2 ConcurrentHashMap

    24710

    图解ConcurrentHashMap

    浅谈ConcurrentHashMap 作者:HuYounger 博客:https://github.com/Rkhcy 文章目录 概述 ConcurrentHashMap是什么 源码分析 Java7 源码分析 稍微说下Java8 总结 0 概述 上篇文章介绍了 HashMap 在多线程并发情况下是不安全的,多线程并发推荐使用 ConcurrentHashMap ,那么 ConcurrentHashMap 这就是ConcurrentHashMap的设计思路,用一个图来理解 ? 从上图可以看出,此时锁的是对应的单个银行,而不是整个「银行者联盟」。 用一个图来表示 Java8 ConcurrentHashMap的样子 ? 3 总结 通过分析源码对比了 HashMap 与 ConcurrentHashMap的差别,以及Java7和Java8上 ConcurrentHashMap 设计的不同,当然还有很多坑没有填,比如其中调用了很多

    30321

    ConcurrentHashMap基础

    ConcurrentHashMap的实现 ConcurrentHashMap作为Concurrent一族,其有着高效地并发操作,相比Hashtable的笨重,ConcurrentHashMap则更胜一筹了 ConcurrentHashMap的属性 ConcurrentHashMap定义了如下几个常量: // 最大容量:2^30=1073741824 private static final int MAXIMUM_CAPACITY 所有插入ConCurrentHashMap的中数据都将会包装在Node中。 TreeNode 在ConcurrentHashMap中,如果链表的数据过长会转换为红黑树来处理。 所以TreeNode也必须是ConcurrentHashMap的一个核心类,其为树节点类。

    28220

    ConcurrentHashMap源码分析

    ConcurrentHashMap是一个可以用于并发环境的集合,在jdk8中实现的原理是CAS+synchronized put方法 public V put(K key, V value) {

    23710

    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中有哪些值得学习的技术呢?

    19420

    爆肝ConcurrentHashMap

    摘要 JDK 1.7 CourrentHashMap实现 为什么放弃分段锁 JDK 1.8 CourrentHashMap实现 ConcurrentHashMap数据结构 ConcurrentHashMap 初始化 ConcurrentHashMap的hash算法 Unsafe.getObjectVolatile方法 ConcurrentHashMap的put操作 ConcurrentHashMap如何判断扩容 ConcurrentHashMap扩容 红黑树退化为链表 学会问自己 1. JDK 1.8 ConcurrentHashMap实现 JDK1.8 ConcurrentHashMap底层的数据结构采用的是数组+链表+红黑树的存储结构,并且放弃了分段锁,利用CAS+Synchronized JDK 1.8 ConcurrentHashMap初始化 ConcurrentHashMap初始化过程并不是在构造的时候,而是在第一次进行put操作的时候通过initTable()方法来进行初始化。

    21220

    ConcurrentHashMap源码阅读

    ConcurrentHashMap是支持高并发、高吞吐量的线程安全的Map实现。下面会通过阅读 ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的源码来了解它的演变过程。 ConcurrentHashMap的数据结构如下: ? ConcurrentHashMap 由 Segment 数组和 HashEntry 数组组成。 一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap 类似,是一种数组和链表结构。 结构 ConcurrentHashMap:下面是ConcurrentHashMap中的数据成员以及构造函数源码: 构造函数主要做了两件事:1)参数的校验;2)table初始化长度 public class ConcurrentHashMap在JDK1.8中的改进 3.1.

    52870

    ConcurrentHashMap 源码分析

    ConcurrentHashMap 源码分析 1. // 空方法,注释说会创建大小为 16 的数组,估计是延时加载 在 put 里面 public ConcurrentHashMap() { } // 设置了 sizeCtl 就是下一次扩容的容量 public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw 首先就判断了 key 和 value 不能为空的情况,一开始觉得还挺奇怪的 HashMap 就允许 null 作为键值为什么 ConcurrentHashMap 却不行,这里我查了一下这段源码作者 Doug 也就是 HashMap 的 resize 方法同时进行了初始化和扩容以及迁移的工作,在 ConcurrentHashMap 中划分的更细致,初始化就只进行初始化,因为他是并发的要考虑到更多。

    70270

    juc系列-ConcurrentHashMap

    1 概述 ConcurrentHashMap和HashMap一样都是基于散列的容器,ConcurrentHashMap可以认为是一种线程安全HashMap,它使用了一中完全不同的加锁策略提高并发性和伸缩性 2 静态结构 2.1 ConcurrentHashMap主要构件: ConcurrentHashMap中主要实体类就是三个: ConcurrentHashMap(整个Hash表) Segment(桶) 一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。 concurrenthashmap.png 下面是ConcurrentHashMap类的声明: public class ConcurrentHashMap<K, V> extends AbstractMap } 3 动态算法 3.1 init-初始化流程 ConcurrentHashMap初始化: public ConcurrentHashMap(int initialCapacity,

    8730

    ConcurrentHashMap源码学习

    经过对hashMap的学习,现在我们来学习一下ConcurrentHashMap的机理。 我们知道juc包是高并发工具包,按照之前提供的高并发集合,那么ConcurrentHashMap也是用来解决多线程中HashMap的问题。 从类结构上看,ConcurrentHashMap的代码还是挺多的。有很多内部类也说明concurrentHashMap的功能比较复杂。当然这些内部类也是专门定制的。 带着这些疑问,我们向concurrentHashMap开炮! public ConcurrentHashMap() { } //传入concurrentHashMap的容量 public ConcurrentHashMap(int initialCapacity

    21110

    ConcurrentHashMap原理分析

    背景 ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable。 对于ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术(Lock Stripping)。 实际上,ConcurrentHashMap对提高并发方面的优化,还有一些其它的技巧在里面(比如你是否知道在get操作的时候,它是否也使用了锁来保护?)。 不变(Immutable)和易变(Volatile) ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。 ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的。

    35640

    ConcurrentHashMap底层原理?

    可能会问的问题 1、用过ConcurrentHashMap吗? 2、为什么要用ConcurrentHashMap? 5、能说一下ConcurrentHashMap是怎么实现的吗? 为什么要用ConcurrentHashMap? jdk1.8算法优化,hash冲突,扩容等问题 关于ConcurrentHashMap实现原理的两个参考回答,自己可以重新组织一下: ConcurrentHashMap采用的是分段式锁,与之对应的就是HashTable ConcurrentHashMap在JDK1.7和JDK1.8之间是有区别的,当然,这个问题也可以这样问: 能说一下ConcurrentHashMap在JDK1.7和JDK1.8中的区别吗? 额外补充:我们对 ConcurrentHashMap 最关心的地方莫过于如何解决 HashMap 在 put 时候扩容引起的不安全问题?

    1.3K30

    ConcurrentHashMap源码分析

    一:简述 本文基于jdk1.8对concurrentHashMap的源码进行分析,以put()方法为入口对concurrentHashMap的扩容机制,size计算方式等代码进行分析 二:concurrentHashMap 的size时需要加cas锁的标记 private transient volatile int cellsBusy; //用于计算concurrentHashMap的size 默认长度是2 private transient volatile CounterCell[] counterCells; 三:concurrentHashMap的源码分析 以put方法为入口对源码进行分析 1.put方法流程图 在扩容的时候设计的非常巧妙,当其他线性调用api的是否如果发现concurrentHashMap正在扩容,会调用helpTransfer方法协助数据的迁移,提高扩容的效率。 的操作的时候,如果发现concurrentHashMap正在扩容,那么会调用helpTransfer协助扩容 final Node<K,V>[] helpTransfer(Node<K,V>[] tab

    6120

    ConcurrentHashMap使用示例

    作者:mononite 链接:https://my.oschina.net/mononite/blog/144329(点击文末阅读原文前往) ConcurrentHashMap通常只被看做并发效率更高的 举个例子:统计文本中单词出现的次数,把单词出现的次数记录到一个Map中,代码如下: private final Map<String, Long> wordCounts = new ConcurrentHashMap )操作,很简单,但非常有用,下面的代码用ConcurrentMap解决上面问题: private final ConcurrentMap<String, Long> wordCounts = new ConcurrentHashMap 下面的代码演示了怎么处理这种情况: private final ConcurrentMap<String, Future<ExpensiveObj>> cache = new ConcurrentHashMap 最后再补充一下,如果真要实现前面说的统计单词次数功能,最合适的方法是Guava包中AtomicLongMap;一般使用ConcurrentHashMap,也尽量使用Guava中的MapMaker或cache

    1.7K90

    ConcurrentHashMap实现原理

    前言 在这篇文章中对属性介绍的比较多:HashMap实现原理 HashMap不是线程安全的,在多线程环境下可以使用Hashtable和ConcurrentHashMap,Hashtable实现线程安全的方式是用 使用的锁分段技术 ConcurrentHashMap的主要结构如下 ? 先看ConcurrentHashMap类的属性 // segments数组的初始容量 static final int DEFAULT_INITIAL_CAPACITY = 16; // 负载因子 static Integer.MAX_VALUE : size; } 在计算ConcurrentHashMap的size时,因为并发操作的缘故,还有可能一直插入数据,可能导致计算返回的 size和实际的size有相差 因为ConcurrentHashMap最多有(MAX_SEGMENTS = 2^16)个Segment,而每个Segment允许的最大容量为(MAXIMUM_CAPACITY = 2 ^30),则最大值为

    26410

    多线程----ConcurrentHashMap

    学习ConcurrentHashMap需要达到以下三点: 一、比较HashMap为什么不是线程安全的,及HashTable是如何实现的安全的,并且HashTable有什么问题?

    6210

    ConcurrentHashMap性能测试

    当时粗略判断其中一个原因是用来存储对象映射关系的java.util.concurrent.ConcurrentHashMap存在瓶颈导致。 所以今天我特意来测试一下java.util.concurrent.ConcurrentHashMap的查询性能,其他增改的功能暂时不做测试了。 思路还是沿用之前的性能测试,通过固定线程的性能模型进行测试,通过调整次数和线程数来测试java.util.concurrent.ConcurrentHashMap的性能表现。 场景设计上我先把java.util.concurrent.ConcurrentHashMap添加N个key和value,然后通过多线程随机从这些key里面取值。 = new ConcurrentHashMap<>() static int times = 1_0000 static int threads = 200 static

    10420

    扫码关注腾讯云开发者

    领取腾讯云代金券