版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaHashMap多线程环境下的死循环分析王舜1Hash表数据结构简单地说一下HashMap这个经典的数据结构。HashMap通常会用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,然后就把这个<key,value>插到table[i]中。如果有两个不同的key被算在了同一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。缺陷:如果table[]的尺寸很小,比如只有2个,如果要放进10个keys的话,那么碰撞非常频繁,于是一个O(1)的查找算法,就变成了链表遍历,性能变成了O(n),这是Hash表的缺陷。Rehash:Hash表的尺寸和容量非常的重要。一般来说,Hash表这个容器当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的无素都需要被重算一遍。这叫rehash,这个成本相当的大。HashMap的rehash源代码Put一个Key,Value对到Hash表中:publicVput(Kkey,Vvalue){......//算Hash值inthash=hash(key.hashCode());inti=indexFor(hash,table.length);//如果该key已被插入,则替换掉旧的value(链接操作)for(Entry<K,V>e=table[i];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k))){VoldValue=e.value;e.value=value;e.recordAccess(this);returnoldValue;}}modCount++;//该key不存在,需要增加一个结点
addEntry(hash,key,value,i);returnnull;}检查容量是否超标voidaddEntry(inthash,Kkey,Vvalue,intbucketIndex){Entry<K,V>e=table[bucketIndex];table[bucketIndex]=newEntry<K,V>(hash,key,value,e);//查看当前的size是否超过了我们设定的阈值threshold,如果超过,需要resizeif(size++>=threshold)
resize(2*table.length);}新建一个更大尺寸的hash表,然后把数据从老的Hash表中迁移到新的Hash表中。voidresize(intnewCapacity){Entry[]oldTable=table;intoldCapacity=oldTable.length;......//创建一个新的HashTableEntry[]newTable=newEntry[newCapacity];//将OldHashTable上的数据迁移到NewHashTable上
transfer(newTable);table=newTable;threshold=(int)(newCapacity*loadFactor);}迁移的源代码,注意红色处:voidtransfer(Entry[]newTable){Entry[]src=table;intnewCapacity=newTable.length;//下面这段代码的意思是://从OldTable里摘一个元素出来,然后放到NewTable中for(intj=0;j<src.length;j++){Entry<K,V>e=src[j];if(e!=null){src[j]=null;do{
Entry<K,V>next=e.next;inti=indexFor(e.hash,newCapacity);
e.next=newTable[i];newTable[i]=e;e=next;}while(e!=null);}}}正常的ReHash的过程并发下的Rehash1)假设我们有两个线程。用红色和浅蓝色标注。再回头看一下transfer代码中的这个细节:do{Entry<K,V>next=e.next;//<--假设线程一执行到这里就被调度挂起了inti=indexFor(e.hash,newCapacity);e.next=newTable[i];newTable[i]=e;e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度光伏发电项目合作合同研究2篇
- 2024年度奢侈品买卖与代理合同
- 2024中国石化金陵石化分公司毕业生招聘40人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电力建设集团河北工程限公司招聘70人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信江西公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国海油春季校园招聘笔试易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度船舶制造起重机安装调试合同
- 2024中国出口信用保险公司宁波分公司劳务派遣员工招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度橱柜企业与物流公司仓储运输合同
- 2024下半年江苏淮安市淮阴区招聘编外用工人员和部分国企人员16人易考易错模拟试题(共500题)试卷后附参考答案
- 客户服务标准化手册
- 2023-2024学年山东省潍坊市青州市、临朐县、昌邑县、诸城市、昌乐县、寿光市八年级(上)期中英语试卷
- 幼儿园课件:古诗《绝句》
- 【新教材】人教版(2024)七年级上册英语Unit 2 Were Family!教案
- 【我国绿色债券市场发展现状及问题探究9100字(论文)】
- 小学教育集团三年发展规划(2024年-2027年)
- (高清版)TDT 1015.1-2024 地籍数据库 第1部分:不动产
- JT-T-1214-2018港口高杆灯技术要求
- JT-T-1168-2017公路桥梁用氟碳面漆
- 人教版七年级数学上册专题01绝对值化简的四种考法(原卷版+解析)
- T-CNFPIA 1003-2022 采暖用人造板及其制品中甲醛释放限量
评论
0/150
提交评论