




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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年智能人体秤项目投资申请报告代可行性研究报告
- 2024年硅系铁合金资金筹措计划书代可行性研究报告
- 落实检察官登记管理办法
- 2024年特种运输资金需求报告代可行性研究报告
- 融媒体教室使用管理办法
- 衡水消防车管理办法规定
- 行政执法公务员管理办法
- 装配式住宅运输管理办法
- 西安市疫情分级管理办法
- 2025至2030中国素食食品行业发展分析及发展趋势分析与未来投资战略咨询研究报告
- 2025年天津出租车考试资料
- 2024年广州市荔湾区社区专职招聘笔试真题
- 《人工智能基础与应用》课件 项目1 认识人工智能
- 网络货运安全管理制度
- 2025至2030全球及中国溴化聚苯乙烯(BPS)行业发展趋势分析与未来投资战略咨询研究报告
- 文化认同机制构建-洞察及研究
- 校园外卖公司管理制度
- BA系统对电气设备动力柜(箱)的自控接口要求
- 汕尾市市直单位招聘政府聘员笔试真题2024
- 辽宁省铁岭市铁岭县2023-2024学年七年级下学期7月期末考试地理试卷(含答案)
评论
0/150
提交评论