范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java多线程下用HashMap要注意了

  Java的HashMap是非线程安全的。多线程下应该用ConcurrentHashMap。
  多线程下[HashMap]的问题(这里主要说死循环问题):  多线程put操作后,get操作导致死循环。  多线程put非NULL元素后,get操作得到NULL值。  多线程put操作,导致元素丢失。  1、为何出现死循环?(在多线程下使用非线程安全的HashMap,单线程根本不会出现)HashMap是采用链表解决Hash冲突,因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环。  在单线程情况下,只有一个线程对HashMap的数据结构进行操作,是不可能产生闭合的回路的。  那就只有在多线程并发的情况下才会出现这种情况,那就是在put操作的时候,如果 size>initialCapacity*loadFactor ,那么这时候HashMap就会进行rehash操作,随之HashMap的结构就会发生翻天覆地的变化。很有可能就是在两个线程在这个时候同时触发了rehash操作,产生了闭合的回路。 2、如何产生的:
  存储数据 put() :  public V put(K key, V value)  {   ......   //算Hash值   int hash = hash(key.hashCode());   int i = indexFor(hash, table.length);   //如果该key已被插入,则替换掉旧的value (链接操作)   for (Entry e = table[i]; e != null; e = e.next) {    Object k;    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {     V oldValue = e.value;     e.value = value;     e.recordAccess(this);     return oldValue;    }   }   modCount++;   //该key不存在,需要增加一个结点   addEntry(hash, key, value, i);   return null;  } 
  当我们往HashMap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。
  如果这个元素所在的位置上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的元素放在链头,而先前加入的放在链尾。
  检查容量是否超标addEntry:   void addEntry(int hash, K key, V value, int bucketIndex)  {   Entry e = table[bucketIndex];   table[bucketIndex] = new Entry(hash, key, value, e);   //查看当前的size是否超过了我们设定的阈值threshold,如果超过,需要resize   if (size++ >= threshold)    resize(2 * table.length);  } 
  如果现在size已经超过了threshold,那么就要进行resize操作,新建一个更大尺寸的hash表,然后把数据从老的Hash表中迁移到新的Hash表中。
  调整Hash表大小resize:   void resize(int newCapacity)  {   Entry[] oldTable = table;   int oldCapacity = oldTable.length;   ......   //创建一个新的Hash Table   Entry[] newTable = new Entry[newCapacity];   //将Old Hash Table上的数据迁移到New Hash Table上   transfer(newTable);   table = newTable;   threshold = (int)(newCapacity * loadFactor);  }
  当table[]数组容量较小,容易产生哈希碰撞,所以,Hash表的尺寸和容量非常的重要。
  一般来说,Hash表这个容器当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,这个过程称为resize。
  多个线程同时往HashMap添加新元素时,多次resize会有一定概率出现死循环,因为每次resize需要把旧的数据映射到新的哈希表,这一部分代码在 HashMap#transfer()  方法,如下:  void transfer(Entry[] newTable)  {   Entry[] src = table;   int newCapacity = newTable.length;   //下面这段代码的意思是:   //  从OldTable里摘一个元素出来,然后放到NewTable中   for (int j = 0; j < src.length; j++) {    Entry e = src[j];    if (e != null) {     src[j] = null;     do {      Entry next = e.next;//取出第一个元素      int i = indexFor(e.hash, newCapacity);      e.next = newTable[i];      newTable[i] = e;      e = next;     } while (e != null);    }   }  } 
  标红代码是导致多线程使用hashmap出现CUP使用率骤增,出现死循环,从而多个线程阻塞的罪魁祸首。另外推荐:Java进阶视频资源  3、图解HashMap死循环:
  正常的ReHash的过程(单线程):假设了我们的hash算法就是简单的用key mod 一下表的大小(也就是数组的长度)。
  最上面的是old hash 表,其中的Hash表的size=2, 所以 key = 3, 7, 5 ,在mod 2以后都冲突在table[1] 这里了。接下来的三个步骤是Hash表 resize成4,然后所有的  重新rehash的过程。
  并发下的Rehash(多线程)
  1)假设我们有两个线程。   do {   Entry next = e.next; // <--假设线程一执行到这里就被调度挂起了,执行其他操作   int i = indexFor(e.hash, newCapacity);   e.next = newTable[i];   newTable[i] = e;   e = next;  } while (e != null); 
  而我们的线程二执行完成了。于是我们有下面的这个样子:
  注意,因为Thread1的 e 指向了key(3),而next指向了key(7),其在线程二rehash后,指向了线程二重组后的链表。我们可以看到链表的顺序被反转后。在这里线程一变成了操作经过线程二操作后的HashMap。
  2)线程一被调度回来执行。  先是执行  newTalbe[i] = e;  然后是 e = next ,导致了e指向了key(7) , 而下一次循环的 next = e.next 导致了next指向了key(3) 。
  3)一切安好。
  线程一接着工作。把 key(7) 摘下来,放到newTable[i] 的第一个,然后把e和next往下移。这个元素所在的位置上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,而先前加入的放在链尾。
  4)环形链接出现。
  e.next = newTable[i]  导致 key(3).next  指向了 key(7) 。
  注意:此时的  key(7).next   已经指向了 key(3)  , 环形链表就这样出现了。
  于是,当我们的线程一调用到, HashTable.get(11) 时,悲剧就出现了——Infinite Loop。
  这里介绍了在多线程下为什么HashMap会出现死循环,不过在真实的生产环境下,不会使用线程不安全的HashMap的。
  来源:https://juejin.cn/post/7003321088386170893

英雄联盟老外怎么看决赛EDGvsDK作者NGA浅川灬(Game1QUICK30FORDKBTWREALFINALSWAST1VSDKBTWRedditanalystsinshamblesWhenhavetheynot冠军打野离队!FPX官宣tian断开连接,未来何去何从?冠军打野离队!FPX官宣tian断开连接,未来何去何从?在FPX兵败冰岛以后,有关于整个队伍即将解散的传言就已经流传开了。除了已经明确要走的上单nuguri之外,其中转会可能最大的电竞分析室曾接触过Niko但他只想打兄弟CS近日,前Cloud9经理HenryG参加了一则访谈类节目,围绕Cloud9从组建到最后解散的一些细节问题。Q你自从离开Cloud9之后已经很久没露面了,很多人都希望你能重回解说席,光环无限通行证太肝!343工作室承诺会做出调整虽然现在评价还稍早,但光环无限(HaloInfinite)的免费多人游戏似乎正在成为一种享受,目前在steam上已经收获了72的好评。不过它也存在一个致命问题战斗通行证的进度实在过EVE星战前夜泛星集市狂欢即将开启,超豪华津贴限时大放送星海漫漫,百舰远航!在EVE正统IP星战策略手游星战前夜无烬星河中,紧张刺激的星际旅途常让飞行员们绷紧神经,现在,一年一度的狂欢节日泛星集市即将到来!EVE无烬星河手游内即将迎来众元宇宙前传即将到来的,是怎样的未来?2021年10月28日,扎克伯格宣布将Facebook母公司更名为Meta,并将Facebook降为母公司旗下与Instagram和WhatsApp并列的产品之一。表明Facebo帝国神话鲜游评测8。1分从种田到冷兵器战争的一站式体验前言在经过一段时间的体验后,紧随帝国神话抢先体验版上线的步伐,我们发布了本篇评测来简要聊聊这款古代东方风格显著的,国产冷兵器战争沙盒网游。帝国神话自首曝以来,凭借其丰富的内容玩法设金蝉一念成佛,一念成魔,XYGTTGEstar皆输,成KPL版本陷阱金蝉在比赛服已经上线两天,而且有队伍已经在比赛中拿出来用了,比如狼队XYG广州TTG武汉Estarpro。但是除了狼队向鱼拿出来赢过一局,其余三场全输,西施王清融更是打出06的比分云顶阵容推荐极客不是打工仔,而是隐藏的T1级Boss说起极客羁绊,大部分人觉得只是S6一个打工羁绊,没法作为主阵容。但就像天龙八部里的虚竹一样,被忽视的小和尚往往也可能是一位傲视武林的功夫大师,特殊环境下极客主C阵容的强度远远超出想云顶之弈新版本改动曝光!圣盾大嘴还要继续加强?人已经麻了在最近,云顶之弈公布了新版本计划,与之前什么强就砍什么设计思路不同的是,这次设计师居然加强现版本火热的圣盾大嘴流强度,还大幅提升了三级海克斯出现的概率。换言之,在下个版本,咱们打出S组又双叒叕乱了,TTG被踢出天狼星,eStar为夺冠练阵容S组又双叒叕乱了,TTG被踢出天狼星,eStar为夺冠练阵容前言大家好,我是阿瑶,每天为你发布游戏领域最新情报。S组的局势真是瞬息万变,在第一轮常规赛的时候,大家都觉得eStar是
游戏王大师决斗发布新预告片预计今年冬季发行科乐美发布了游戏王大师决斗新预告片,该作将于今年冬季正式上线,登陆PS5PS4XboxSeriesXSXboxOneSteamSwitchiOS和安卓,支持4K分辨率。预告视频优酷历年LPL年度MVP选手盘点,这些人里面,谁是你心中的MVP?LPL赛区每一年的年度盛典中,都会对这一年的优秀选手们进行颁奖,而年度MVP选手也代表了这一年发挥最优秀的选手,那么历年的年度mvp选手分别是谁呢?2014年的年度MVP选手是皇族CF解封的心路历程,希望对误封的玩家有用帮助(附教程)可能无用首先我是玩了很长时间的老玩家了,游戏误封的确很闹心,所以劝大家冷静。收集证据,主动申诉,有理有据。好,那废话不多说,我直接开始了。2021年8月9号,我在回家的路上,手机来了一条消战神蚩尤手游怎么多开搬砖?这几点尤其重要,普通玩家也能用可以搬砖的游戏都需要有一定的玩家基础,而一般人想搬砖对于流程肯定要先熟悉,战神蚩尤里面搬砖属于相对简单的那种,只要会打材料就好了的,刷什么材料看别人都在收什么就好了,下面来点干货给灵笼末世人类苟活空中,机甲部队重回地表,发现怪兽已统治世界在未来我们的世界已经不堪重负,因为人类繁衍的过快。人类必须找到新的家园,才能保证人类的繁衍大计。这时天崩地裂,人类能有多少人存活未可知。地球恢复平静以后,剩下的人类慢慢从废墟中生存魔兽世界9。15萌新狂暴战法师塔分享心得作者NGA蛇眼西格德之前看论坛大家都说法师塔狂暴战抠脚打,于是本萌新小白就看了看帖子搞了搞配装,撸起袖子就上了硬生生打了70多次才过,所以就写了这个小小的心得贴分享给跟我一样是萌新外媒发布LPL新赛季阵容强度排名EDGRNGLNG位列前三外媒LeagueOnLcok昨日发布了LPL新赛季阵容强度排名的第617名队伍,今日发布了前五队伍的具体排名,S11冠军阵容EDG稳居第一,新赛季招入Bin并让Xiaohu重回中路魔兽争霸3熊猫大招很强不假,但分身不算英雄,装备也基本无效为了保证游戏平衡性,魔兽争霸3中英雄属性和技能出现了较大差异,大招能力逆天的英雄自然也随之出现了不少。而在众多大招效果强大的英雄中,一个英雄直接变成3个的熊猫分身,无疑是最受玩家喜S26因装备受影响的英雄,奶爸奶妈太可怜,冰霜冲击干废一群英雄大家好我是指尖,体验服的大批量装备更新已经过去了一段时间了,有些已经正式安装到了正式服,但是还有较大一部分只在体验服中调整,那是给s26赛季预留的更新内容,之前指尖跟大家分享了下赛一梦江湖之少侠大型变(沙)身(雕)现场!是那些你想不到的快乐大家纵横江湖多年,不知道有没有遇到过一些不(广)为(而)人(告)知的快乐源泉呢?本人最近就发现,咱们江湖上多了一个物种不仅自带搞笑buff,还可以产生携带作用,把周围一圈的少侠们全吃鸡圣诞节返场活动,今晚返场10套军需,人字拖猫包尽在其中此前就有消息称圣诞节期间将会返场皮肤,果不其然,今天凌晨12点和平精英的官方也是正式发布了公告说今晚即将要返场10套皮肤,其中包含了2个大转盘军需3个中转盘军需以及5个荣耀勋章军需