首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ConcurrentHashMap? 相信看完这篇没人能难住你!

HashMap 容量大小是固定,而源码中可以看到默认初始化时给定默认容量 16,负载因子 0.75。...判断该位置是否链表。 不是链表就根据 key、key hashcode 是否相等来返回值链表则需要遍历直到 key 及 hashcode 相等时候就返回值。...---- JDK1.8中HashMap 不知道 1.7 实现大家看出需要优化点没有?...1、put 方法(put里调用是putVal): ? 看似要比 1.7 复杂,我们一步步进行拆解: 判断当前桶是否空,空需要初始化(resize 中会判断是否进行初始化)。...不会像 HashTable 那样不管是 put 还是 get 操作都需要同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)线程并发。

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

ConcurrentHashMap? 相信看完这篇没人能难住你!

get 方法 再来看看 get 函数: public V get(Object key) { if (key == null) return getForNullKey...判断该位置是否链表。 不是链表就根据 key、key hashcode 是否相等来返回值链表则需要遍历直到 key 及 hashcode 相等时候就返回值。...put 方法 看似要比 1.7 复杂,我们一步步拆解: 判断当前桶是否空,空需要初始化(resize 中会判断是否进行初始化)。...不会像 HashTable 那样不管是 put 还是 get 操作都需要同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)线程并发。...put 方法 重点来看看 put 函数: 根据 key 计算出 hashcode 。 判断是否需要进行初始化。

16320

Java面试题:HashMap为什么线程不安全、ConcurrentHashMap原理、ConcurrentHashMap与HashMap区别、Map总结

除此之前,还有代码第38行处++size,假设线程A、B同时进行put操作,当前HashMapzise大小10,当线程A执行到第38行代码时,主内存中获得size10后准备进行+1操作,但是由于时间片耗尽只好让出...JDK1.8版本数据结构变得更加简单,使得操作也更加清晰流畅,因为已经使用synchronized来进行同步,所以不需要分段锁概念,也就不需要Segment这种数据结构了,由于粒度降低,实现复杂度也降低了...首先会判断 key、value是否空,如果空就抛异常;接着会判断容器数组是否空,如果空就初始化数组;进一步判断,要插入元素f,在当前数组下标是否第一次插入、即该hash位置节点是否空,如果是就通过...get方法public V get(Object key) { Node[] tab; Node e, p; int n, eh; K ek; // 计算hash...3)Put操作变化根据 key 计算出 hashcode,然后开始遍历 table;判断是否需要初始化;f 即为当前 key 定位出 Node,如果空表示当前位置可以写入数据,利用 CAS 尝试写入

4610

谈谈Java中常见线程安全模型

这样做就让get操作同步中解脱出来。因为更改数据并没有发生在get所需数组中。而是放在新创建副本中,所以不需要同步。但应该注意是,尽管如此,get操作还是可能会读取到脏数据。...数组第i项 casTabAt函数是对比tab第i项是否与c相等,相等的话将其设置v。...setTabAt将tab第i项设置v 有了这三个函数就可以保证ConcurrentHashMap线程安全吗?...判断table是否初始化,未初始化进行初始化操作 Node在table中目标位置是否空,空的话使用caw操作进行赋值,当然,这种赋值是有可能失败,所以前面的死循环发挥了重试作用。...相比于put,get代码更好理解一下: public V get(Object key) { Node[] tab; Node e, p; int n, eh; K ek;

36720

浅析几种线程安全模型

这样做就让get操作同步中解脱出来。因为更改数据并没有发生在get所需数组中。而是放生在新生成副本中,所以不需要同步。但应该注意是,尽管如此,get操作还是可能会读取到脏数据。...数组第i项 casTabAt函数是对比tab第i项是否与c相等,相等的话将其设置v。...setTabAt将tab第i项设置v 有了这三个函数就可以保证ConcurrentHashMap线程安全吗?...判断table是否初始化,未初始化进行初始化操作 Node在table中目标位置是否空,空的话使用caw操作进行赋值,当然,这种赋值是有可能失败,所以前面的死循环发挥了重试作用。...相比于put,get代码更好理解一下: public V get(Object key) { Node[] tab; Node e, p; int n, eh; K ek;

59430

【死磕 Java 并发】—– J.U.C 之 Java并发容器:ConcurrentHashMap

,keyk节点 final TreeNode findTreeNode(int h, Object k, Class<?...由于TreeBin代码太长我们这里展示构造方法(构造方法就是构造红黑树过程): static final class TreeBin extends Node {...超过微信文章长度 } 上面的源码有点儿长,稍微复杂了一些,在这里我们抛弃它多线程环境,我们单线程角度来看: 每个内核分任务,并保证其不小于16 检查nextTable是否null,如果是,...和i + n位置,并将ForwardingNode 插入原节点位置,代表已经处理过了 如果fTreeBin节点,同样也是构造一个反序 ,同时需要判断是否需要进行unTreeify()操作,并把处理结果分别插入到...超过微信文章长度 } 从上面源码可以看出,构建红黑树过程是同步,进入同步后过程如下: 根据table中index位置Node链表,重新生成一个hd头结点TreeNode 根据hd头结点,

61920

深入解析 ConcurrentHashMap 实现内幕,吊打面试官?没问题

scanAndLockForPut会去查找是否有key相同Node ConcurrentHashMap.HashEntry node = tryLock() ?...(hash, key, value, first); int c = count + 1; // 判断是否需要扩容...我觉得这个地方比较有意思,ConcurrentHashMap 默认构造函数如下: public ConcurrentHashMap() { } 发现没这个构造函数啥事没干,为啥要这样设计?...初始化流程: 1、判断 sizeCtl 值是否小于 0,如果小于 0 则表示 ConcurrentHashMap 正在执行初始化操作,所以需要先等待一会,如果其它线程初始化失败还可以顶替上去 2、如果...第六步、进行 addCount(1L, binCount) 操作,该操作会更新 size 大小,判断是否需要扩容,addCount 方法源码如下: 1、对 map size 加一 2、检查是否需要扩容

46430

如何保证集合是线程安全? ConcurrentHashMap如何实现高效地线程安全?

implements Map, Serializable { private fnal Map m; // Backing Map fnal Object mutex; // Object...你可以参考下面这个早期ConcurrentHashMap内部结构示意图,其核心是利用分段设计,在进行并发操作时候,只需要锁定相应段,这样就有效避免了类似Hashtable整体同步问题,大大提高了性能...针对具体优化部分,方便理解,我直接注释在代码段里,get操作需要保证是可见性,所以并没有什么同步逻辑。...Node next; // … }我这里就不再介绍get方法和构造函数了,相对比较简单,直接看并发put是如何实现。...今天我线程安全问题开始,概念性总结了基本容器工具,分析了早期同步容器问题,进而分析了Java 7和Java 8中ConcurrentHashMap是如何设计实现,希望ConcurrentHashMap

43320

这篇3万字Java后端面试总结,面试官看了瑟瑟发抖(一)

2、线程安全性不同 javadoc中关于hashmap一段描述如下:此实现不是同步。如果多个线程同时访问一个哈希映射,而其中至少一个线程结构上修改了该映射,则它必须保持外部同步。...在多线程并发环境下,可以直接使用Hashtable,不需要自己方法实现同步,但使用HashMap时就必须要自己增加同步处理。...ConcurrentHashMap源码 ❝问:ConcurrentHashMap底层原理,如何保证线程安全❞ 这里讨论JDK1.8ConcurrentHashMap 采用了「数组+链表+红黑树」实现方式来设计...V val; volatile Node next; ... } 保证线程安全,采用synchronized+CAS+HashEntry+红黑树。...在那些需要一次一次遍历,去寻找元素问题中,可以将问题转化为根据元素内容去寻找索引,哈希表在这方面的时间效率是贼高;在一些字符串词频统计问题、数独问题等问题中,可以利用哈希函数来计算某个元素出现次数

22910

【JAVA】ConcurrentHashMap 如何实现高效地线程安全?

具体选择要看开发场景需求,总体来说,并发包内提供容器通用场景,远优于早期简单同步实现。   正文 1、为什么需要 ConcurrentHashMap?... m; // Backing Map final Object mutex; // Object on which to synchronize // …...可以参考下面这个早期 ConcurrentHashMap 内部结构示意图,其核心是利用分段设计,在进行并发操作时候,只需要锁定相应段,这样就有效避免了类似 Hashtable 整体同步问题,大大提高了性能...volatile V val; volatile Node next; // … } 这里就不再介绍 get 方法和构造函数了,相对比较简单,直接看并发...所有内容了; 线程安全问题开始,概念性总结了基本容器工具,分析了早期同步容器问题,进而分析了 Java 7 和 Java 8 中 ConcurrentHashMap 是如何设计实现,希望 ConcurrentHashMap

19230

Java容器(List、Set、Map)知识点快速复习手册

= null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue();...插入 键值对,先计算 K3 hashCode 118,使用除留余数法得到所在桶下标 118%16=6,插在 前面。...长度 M,需要存储键值对数量 N,如果哈希函数满足均匀性要求,那么每条链表长度大约为 N/M,因此平均查找次数复杂度 O(N/M)。...ConcurrentHashMap命名就能看出,它是个HashMap。而Collections.synchronizedMap()可以接收任意Map实例,实现Map同步。比如TreeMap。...如果是映射,我们就考虑使用Map 是否需要同步:去找线程安全集合类使用 迭代时是否需要有序(插入顺序有序):去找Linked双向列表结构 是否需要排序(自然顺序或者手动排序):去找Tree

62350

【小家java】HashMap原理、TreeMap、ConcurrentHashMap原理、性能、安全方面大解析-----看这一篇就够了

threshold是HashMap阈值,用于判断是否需要调整HashMap容量。...前面我们提到过,哈希函数设计至关重要,好哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,我们需要清楚是,数组是一块连续固定长度内存空间,再好哈希函数也不能保证得到存储地址绝对不发生冲突...我们看到,上面的&运算,高位是不会对结果产生影响(hash函数采用各种位运算可能也是为了使得低位更加散列),我们关注低位bit,如果低位全部1,那么对于h低位部分来说,任何一位变化都会对结果产生影响...(Object key) boolean containsValue(Object value) Set> entrySet() V...HashMap并执行put操作,而有大于两个keyhash值相同,如图中a1、a2,这个时候需要解决碰撞冲突,而解决冲突办法上面已经说过,对于链表结构在这里不再赘述,暂且不讨论是链表头部插入还是尾部初入

1K10
领券