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

ConcurrentHashMap使用示例

作者:mononite 链接:https://my.oschina.net/mononite/blog/144329(点击文末阅读原文前往) ConcurrentHashMap通常只被看做并发效率更高的...实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为是否正确。...除了用锁解决这个问题,另外一个选择是使用ConcurrentMap接口定义的方法: public interface ConcurrentMap extends Map {...但换个场景,比如缓存,那么这很可能就是问题了,因为缓存中的对象获取成本一般都比较高,而且通常缓存都会经常失效,那么避免重复创建对象就有价值了。...最后再补充一下,如果真要实现前面说的统计单词次数功能,最合适的方法是Guava包中AtomicLongMap;一般使用ConcurrentHashMap,也尽量使用Guava中的MapMaker或cache

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

图解ConcurrentHashMap

浅谈ConcurrentHashMap 作者:HuYounger 博客:https://github.com/Rkhcy 文章目录 概述 ConcurrentHashMap是什么 源码分析 Java7...源码分析 稍微说下Java8 总结 0 概述 上篇文章介绍了 HashMap 在多线程并发情况下是不安全的,多线程并发推荐使用 ConcurrentHashMap ,那么 ConcurrentHashMap...上面的代码先找出扩容前后需要转移的节点,先执行转移,然后再把该条链上剩下的节点转移,之所以这么写是起到复用的效果,注释中也说了,在使用默认阈值的情况下,只有大约 1/6 的节点需要被 clone 。...用一个图来表示 Java8 ConcurrentHashMap的样子 ?...3 总结 通过分析源码对比了 HashMap 与 ConcurrentHashMap的差别,以及Java7和Java8上 ConcurrentHashMap 设计的不同,当然还有很多坑没有填,比如其中调用了很多

53721

ConcurrentHashMap源码(二)

return e.val; } else if (eh < 0) // hash小于0,说明是树或者正在扩容 // 使用...是HashMap的线程安全版本; (2)ConcurrentHashMap采用(数组 + 链表 + 红黑树)的结构存储元素; (3)ConcurrentHashMap相比于同样线程安全的HashTable...,效率要高很多; (4)ConcurrentHashMap采用的锁有 synchronized,CAS,自旋锁,分段锁,volatile等; (5)ConcurrentHashMap中没有threshold...和loadFactor这两个字段,而是采用sizeCtl来控制; (6)sizeCtl = -1,表示正在进行初始化; (7)sizeCtl = 0,默认值,表示后续在真正初始化的时候使用默认容量; (...不是强一致性的; (19)ConcurrentHashMap中不能存储key或value为null的元素; ConcurrentHashMap中有哪些值得学习的技术呢?

54220

ConcurrentHashMap源码阅读

前言 HashMap是非线程安全的,在多线程访问时没有同步机制,并发场景下put操作可能导致同一数组下的链表形成闭环,get时候出现死循环,导致CPU利用率接近100%。...Segment:每个Segment相当于ConcurrentHashMap的一个子 hash表,Segment继承了ReetrantLock,为了方便使用加锁的功能,如lock,tryLock等。...put需要加锁,使用了ReetrantLock的tryLock的非阻塞加锁方法。...JDK1.7中先后采取了两个方案: 第一种方案:先使用不加锁的模式先尝试遍历两次ConcurrentHashMap计算size,如果两次遍历过程中所有segment中的modCount的和是一致的,则可以认为整个计算过程中的...改进3:并发控制使用synchronized和CAS,使用synchronized替换ReetrantLock。

97770

Java的ConcurrentHashMap

那么我就这几个方面了解一下ConcurrentHashMap: 1)ConcurrentHashMap在JDK8里结构 2)ConcurrentHashMap的put方法、szie方法等 3)ConcurrentHashMap...的扩容 4)HashMap、Hashtable、ConccurentHashMap三者的区别 5)ConcurrentHashMap在JDK7和JDK8的区别 源码分析 ConcurrentHashMap...=null,则使用synchronized锁住f元素(链表/红黑树的头元素)。如果是Node(链表结构)则执行链表的添加操作;如果是TreeNode(树型结构)则执行树添加操作。...,当有冲突的时候才进行并发处理,而且流程步骤很清晰,但是细节设计的很复杂,毕竟多线程的场景也复杂. get方法 concurrentHashMap的get操作的流程很简单,可以分为三个步骤来描述: 计算...3、使用3个CAS操作来确保node的一些操作的原子性,这种方式代替了锁。 4、sizeCtl的不同值来代表不同含义,起到了控制的作用。

50810

ConcurrentHashMap源码解析

转载请以链接形式标明出处: 本文出自:103style的博客 base on jdk_1.8.0_77 目录 ConcurrentHashMap的用途 ConcurrentHashMap的常量介绍...ConcurrentHashMap的相关函数 小结 参考文章 ---- ConcurrentHashMap简介 ConcurrentHashMap 是在 HashMap 的线程安全的版本,不允许 空键空值...和HashMap类似,ConcurrentHashMap使用了一个table来存储Node,ConcurrentHashMap同样使用记录的key的hashCode来寻找记录的存储index,而处理哈希冲突的方式与...接下来将详细分析ConcurrentHashMap的主要操作方法,以及ConcurrentHashMap是如何保证在并发环境下的线程安全的。...的相关函数 spread(int h):散列计算 tableSizeFor(int c):根据传入的值计算ConcurrentHashMap的容量 size():计算ConcurrentHashMap的大小

11120

ConcurrentHashMap#Put

、如果是红黑树,插入红黑树   4.4、如果链表长度超过8,转为红黑树   4.5,如果key已经存在,覆盖旧值 5,总元素个数累加,需要扩容,则扩容 其余分支我们后面可以细讲,现在简略讲下分支2,它使用...无锁模式将元素添加到空桶,代码如下: else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { 找该 hash 值对应的数组下标,得到第一个节点 f,使用...tab的使用必须由调用方进行非空检查。 所有调用者还预先检查tab的长度是否不为零(或其他等效检查),从而确保任何(length-1) & hash参数都是有效索引。...我们不想浪费空间,将不同锁对象与每个bin关联, 所以应该使用bin列表的第一个节点本身作为锁。对这些锁的锁定支持依赖于内置的“同步”监视器。

58410

ConcurrentHashMap实现原理

2.ConcurrentHashMap的内部结构 ? ConcurrentHashMap主要有三大结构:整个Hash表,segment(段),HashEntry(节点)。...注意,之所以在每个 Segment 对象中包含一个计数器,而不是在 ConcurrentHashMap使用全局的计数器,是为了避免出现“热点域”而影响 ConcurrentHashMap 的并发性。...ConcurrentHashMap 类 默认的情况下,每个ConcurrentHashMap 类会创建16个并发的segment,每个segment里面包含多个Hash表,每个Hash链都是有HashEntry...4.总结 在使用锁来协调多线程间并发访问的模式下,减小对锁的竞争可以有效提高并发性。有两种方式可以减小对锁的竞争: 减小请求同一个锁的频率。 减少持有锁的时间。...使用分离锁,减小了请求同一个锁的频率。

87140
领券