一图了解ConcurrentHashMap底层原理

作者&投稿:德芸 (若有异议请与网页底部的电邮联系)
~ 1、ConcurrentHashMap底层数据结构是一个数组table
2、table数组上挂着单向链表或红黑树
3、new ConcurrentHashMap();如果没有指定长度的话,默认是16,并且数组长度必须是2的n次幂,若自定义初始化的长度不是2的n次幂,那么在初始化数组时,会吧数组长度设置为大于自定义长度的最近的2的n次幂。(如:自定义长度为7,那么实际初始化数组后的长度为8)
4、底层是使用synchronized作为同步锁,并且锁的粒度是数组的具体索引位(有些人称之为分段锁)。
5、Node节点,hash>0,当hash冲突时,会形成一个单向链表挂在数组上。
6、ForwardindNode,继承至Node,其hash=-1,表示当前索引位的数据已经被迁移到新数组上了
7、ReservationNode,继承至Node,其hash=-3,表示当前索引位被占用了(compute方法)
8、TreenBin,继承至Node,其hash=-2,代表当前索引下挂着一颗红黑树
9、lockState为ConcurrentHashMap底层自己实现的基于cas的读写锁,锁粒度是具体的某颗树。当向红黑树进行增,删操作时,首先会先上sync同步锁,然后自平衡的时候会上lockState写锁,当读红黑树的时候,会上lockState读锁,然后判断此时是否有线程正持有写锁,或是否有线程正在等待获取写锁,若有,则读线程会直接去读双向链表,而不是去读红黑树。
10、TreeNode,hash>0,为红黑树具体节点。TreeBin的root代表红黑树的根节点,first代表双向链表的第一个节点
11、双向链表:构建红黑树时还维护了一个双向链表,其目的为:(1)当并发写读同一颗红黑树的时候,读线程判断到有线程正持有写锁,那么会跑去读取双向链表,避免因为并发写读导致读线程等待或阻塞。(2)当扩容的时候,会去遍历双向链表,重新计算节点hash,根据新的hash判断放在新数组的高位还是地位

1、触发扩容的规则:
1)添加完元素后,若判断到当前容器元素个数达到了扩容的阈值(数组长度*0.75),则会触发扩容
2)添加完元素后,所在的单向链表长度>=8,则会转为红黑树,不过在转红黑树之前会判断数组长度是否小于64,若小于64则会触发扩容
2、table为扩容前的数组,nextTable为扩容中创建的新数组,迁移数据完毕后需要将nextTable赋值给table
3、扩容后的数组是元素组长度的2倍
4、ln,hn分别表示高位和低位的链表(高链,低链)。即,扩容时,会用n&h==0来判断元素应该放在新数组的i位置还是i+n位置。n:元素组长度;h:元素hash值;i:元素所在的原数组索引位;。这样就会出现有些元素会被挂在低位,有些元素会被挂在高位,从而达到打散元素的目的。
5、红黑树扩容时,会遍历双向链表,并且计算n&h==0来判断元素放在低位(lo)还是高位(ho),确定完元素的去处之后,会判断分别判断两个双向链表(lo,ho)的长度是否大于6,若大于6则将还是以一颗红黑树的结构挂在数组上,若<=6的话,则转为单向链表,挂在数组上


手加concur如何打印报告
转成图片格式再打印。具体的操作步骤为:1、选择多张一起打印的图片,右击选择打印,直接进入打印页面。2、在右侧的布局中选择第二个13X18厘米,实现一张A4张上打印2张电子发票。3、取消勾选适应边框打印,否则打印出来会不全。4、设置完成,点击打印。

concur报销APP非常慢
concur报销APP非常慢是网络问题,或者软件加载太多。APP就是Application的缩写,意思是应用程序。APP一般指的是手机里的第三方应用软件,对于这些app,更多的用户习惯称为应用软件,比如微信app、支付宝app等,一个APP常是指能够执行某种功能的软件程序。比如,文字处理程序、数据库程序、网络浏览器、图像编辑...

同时的网络解释同时的网络解释是什么
同时的网络解释是:同时同时:汉语词语同时:戴荃演唱歌曲同时(汉语词语)同时是一个词语,读音为tóngshí,意思是同时代,同一时候,同时发生,出自《资治通鉴》。同时还有并且的意思,例如任务艰巨,同时时间又很紧迫。同时的网络解释是:同时同时:汉语词语同时:戴荃演唱歌曲同时(汉语词语)同时是一个词语...

最常见企业管理SAAS软件有哪些?
最常见企业管理SAAS软件有8MSaaS 企业管理软件。100%自主研发采用区块链技术的企业管理软件 ,功能模块包括:CRM客户管理, PPM项目管理, 采购与供应商管理, HCM人力资源管理, OA办公协同, Finance财务等。 所有产品都可在云端部署,并且支持高度客制化。可以按需选择租用我们产品(SaaS)或购买永久许可...

形容科幻片英文C打头哪些形容词?
Currency 今天跟大家讲的这个词叫currency,主要意思是“货币”,其词根是cur,也写作cor, cour, car等于run,跑动、流动,这个词根所派生的词还不少,比如occur发生,incur造成,concur同意,course 进程(也就是流程),courier信使, carry携带,cargo货物,carriage马车, charge装载, car小汽车, chariot战车…大家看看, 上面那...

overcome固定搭配?
76.concur (with sb) (in sth) | ~ (with sth)同意;赞同 Historians have concurred with each other in this view. 历史学家在这个观点上已取得一致意见。 77.submit to使某人忍受某事: All those entering and leaving the country shall submit to inspection at the port. 出入境人员应接受口岸检察机关...

星际争霸!发烧友进来!
Terran Marine "You want a piece of me, boy?"We gotta move!Are you gonna give me orders?Oh my god! He's whacked!I vote we frag this commander.How do I get out of this chicken *BEEP* outfit?! - Communications Technician Private W. Hudson, Aliens You want a piece of me...

怎样更好的利用时间记单词?
5.我跟你说!你每天要看以两段文字,如果没有时间,那就考试前一个星期每天看两篇!这样可以保持考试的阅读速度!6.抄的单词本你们要复习啊!7.找一个外国歌手做你的偶像,把他(她)的歌听完全 .8.多看中英对照文章,这样对你的翻译语感非常有帮助 1.逻辑记忆:通过词的本身的内部逻辑关系,词...

英语翻译 不要机器翻译的
Summary of results for life cycle assessment (12 p.e.)到table1 图 ever, the conventional systems have significantly higher energy utilisation in their operation, due to the aeration and pumping equipment that they employ (Fig. 3). The results concur with those of Brix (1999) that...

jdk 1.5.0.09怎么配置
JDK安装界面如下图所示:在选择界面、安装路径中,本例为:e:\\jdk1.4.2 安装完成后,进行环境变量的配置,可以有多种方法进行设置,这里只说明其中最简单的一种:1.JAVA_HOME 环境变量配置 在桌面上用鼠标右键单击“我的电脑”,依次为“属性”、“高级”、“环境变量”。新建一个系统变量,名称为...

晋城市13984779808: JAVA中线程安全的map有哪些? -
沃支替米: JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap.java中map中线程安全怎么实现:1. 同步的map就是Hashtable, concurrenthashmap.2. 你看到的Hashtable就是直接在hashmap上加了个锁,concurrenthashmap...

晋城市13984779808: concurrenthashmap是怎么实现线程安全的 -
沃支替米: 在ConcurrentHashMap没有出现以前,jdk使用hashtable来实现线程安全,但是hashtable是将整个hash表锁住,所以效率很低下.ConcurrentHashMap将数据分别放到多个Segment中,默认16个,每一个Segment中又包含了多个HashEntry列表...

晋城市13984779808: 如何在java中使用ConcurrentHashMap -
沃支替米: 参考如下内容:ConcurrentHashMap锁的方式是稍微细粒度的. ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶.试想,原来 只能一个线程进入,现在却能同时16个写线程进入(写...

晋城市13984779808: ConcurrentMap和HashMap的区别 -
沃支替米: 1.hashMap可以有null的键,concurrentMap不可以有 2.hashMap是线程不安全的,在多线程的时候需要Collections.synchronizedMap(hashMap),ConcurrentMap使用了重入锁保证线程安全. 3.在删除元素时候,两者的算法不一样. http://sinly.iteye.com/admin/blogs/1270748http://sinly.iteye.com/admin/blogs/1264762

晋城市13984779808: java专用于并发的map -
沃支替米: HashTable是线程安全的,可以作为并发情况下使用. 当然jdk提供一个java.concurrent包,里面是提供一些并发的api,其中ConcurrentHashMap可以作为并发Map.

晋城市13984779808: java8中的concurrenthashmap与之前版本的有什么不同 -
沃支替米: 最大的区别就是ConcurrentHashMap是线程安全的,hashMap不是线程安全的. 为什么线程

晋城市13984779808: java 如何遍历concurrenthashmap -
沃支替米: 和遍历HashMap是一样的,有多种方法,给出计算较少的一种 ConcurrentHashMap<K,V> map=....数据 for(Map.Entry<K,V> e: map.entrySet() ){System.out.println("键:"+e.getKey()+", 值:"+e.getValue()); }

晋城市13984779808: concurrenthashmap 怎么实现线程安全 -
沃支替米: ConcurrentMap能够保证每一次调用(例如一次putIfAbsent)都是原子操作,不受多线程影响,但并不保证多次调用之间也是原子操作.以上实现的GetKeyBM方法中,ConcurrentMap的方法被调用了许多次,不同线程之间必然存在着竞争关系...

晋城市13984779808: concurrentHashMap是线程安全且强一致性的吗 -
沃支替米: 单独的读写操作(get,put,putIfAbsent...)是完全线程安全且一致的,但是迭代时候则不是强一致的,迭代所遍历的不是迭代时刻的快照,而是各个segement的真是数据,所以迭代期间如有数据发生变更,如果变更的是已经遍历的segement则迭代过程不再感知这个变化,但如果变化发生在未遍历的segement,则本次迭代会感知到这个元素.另外一个基本常识,任意的组合操作,比如先get, 然后put,则不能保证强一致.此外这个类还有个特点,迭代过程中即使元素被修改,也不会抛出异常,其他一些集合则会抛出ConcurrentModificationException

晋城市13984779808: 二氧化碳是日常生活中常见的一种气体,也是初中重点学习的一种物质,为了更好的了解二氧化碳的性质,同学们完成了以下有关二氧化碳的实验,请根据... -
沃支替米:[答案] 【一】图1中的实验现象是蜡烛由下往上依次熄灭,说明CO2具有的性质是密度比空气大,不能燃烧,不支持燃烧.如图2的家庭小实验,观察到高的蜡烛线熄灭,原因是热的二氧化碳的密度比空气小.小明还观察到茶杯内壁变黑...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网