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

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

有哪些游戏中有趣的bug被官方作为设定保留了下来?在我的印象中,有这么几个甘和平在文明初代中,有一个好战度的设定,当玩家发展到民主社会时,国家的好战度就会减2,而当时游戏中和平的使者爱与正义的化身甘地,他的领袖特质就是好战度为1(魔兽世界怀旧服T2腿成牧师心头好,P1阶段500金,P6已涨到9000金,T2腿这么保值吗?魔兽世界怀旧服开放到现在,装备的价格也在不断地变化,目前除了风剑之外,即便是NAXX中的装备也在随着时间的推移不断下降。然而最近一段时间,MC中的一件装备却涨到了令人看不懂的地步。王者荣耀三年老玩家,充值数万买皮肤,卖号时商人出价只有600,你觉得少吗?算算时间,王者荣耀上线也有三年的时间了,不管游戏做的怎么样,但必须承认的是,王者荣耀确实是一款非常成功的游戏,仅是去年就给腾讯带来了200多亿元的收入,一款公平竞技游戏,靠着卖皮肤王者荣耀虞姬全皮肤对比,有人说加勒比3分,女王5分,而霸王别姬满分吊打云霓雀翎,你怎么看?加勒比和原皮没多大手感区别。金色赛季皮年代久远换色特效。霸王别姬手感打击感是最好的,我常用这个皮肤,一技能大花球,视觉范围大不少。海报无敌美貌。除了唱戏有点吵。云霓雀翎回城桃花下起拳头成立LOLM第二赛区!居然不是中国赛区,WPL恐将成为泡沫最近一段时间想必各位都听说过英雄联盟手游即将登陆国服的消息!在5月16日这一天腾讯游戏发布会上面就公布了英雄联盟手游国服即将上线的消息,后续在5月20日这一天英雄联盟手游正式官宣将游戏盒子代理是什么意思?手游行业的蓬勃发展程度就不必多说了,也有很多人想要考虑游戏代理行业,当然我们很多人对于游戏代理并不陌生,可是关于游戏盒子代理很多人就有点模棱两可了。游戏盒子代理就是推广代理的游戏,DK轻松击溃MAD,ShowMaker永恩主宰赛场,Kkoma狠话能否成真?时至5月下旬,2021Msi步入收官阶段,在首场BO5淘汰赛中,小虎Gala率RNG轻松淘汰PSG,成为首支挺进2021Msi决赛的LOL参赛队伍,凭借积分优势,LPL赛区顺利收获不止游戏电影和游戏中弩的实际威力究竟有多大?欢迎收看本期的不止游戏,我是乔伊。在最终用投石兵杀死敌人后,您渴望一种更强大的远程武器。在最终用弓箭杀死一名敌人后,你渴望拥有一种更为强大的远程武器。那便是弩。弩,继弓箭之后人类历铠皇克星突然诞生,自带风暴龙王,高端局无天敌在王者荣耀中,想要获得比赛的胜利,并不是看哪一方击杀的人头数更多,而是看谁先摧毁对面的水晶。由于高地塔和一些手长英雄的存在,即使是优势一方也很难一波把高地推掉。为了避免游戏时间过长北慕面对韩涵直接自闭,跟梦之队四个队友道歉!教练出来直接大骂作为王者荣耀顶尖打野主播,北慕算是很多玩家心目中的操作型打野天花板。北慕不仅拥有多个国标,而且还很勤奋,多次拿下国服巅峰赛定榜第一,所以北慕对于自己要求也很高。可就在最近的一次梦之航海王热血航线冒险经历,再现传奇,追逐梦想的征途鲸乐丨文如果说成为海贼王是路飞的梦想,那我们的梦想或许就是成为像路飞一样的男人,自信又强大。或许路飞并不一定是你喜欢的角色,但路飞的形象确实深入人心。无论是现实还是游戏中,这样强势
每日游讯7月15日农历六月初六星期四工作顺利关注每日游讯,只发布最简短的游戏资讯!本期封面1。死亡细胞移动版于今年2月份在中国国内上线,经过5个月的时间在国内销量突破200万份。2。PlayStation商城美服最后的生还者每日游讯7月29日农历六月二十星期四工作顺心关注每日游讯,只发布最简短的游戏资讯!1。凯娜精神之桥原计划于8月24日登陆PS5和PC平台,开发商通过官方社交媒体发布消息,宣布该游戏将延期到9月21日发售,延期一个月。2。发行steam商店疯狂周三叛乱怪物猎人世界等游戏特惠促销中每日更新steam游戏榜单和新鲜资讯,关注我不迷路目录LEGO建造者之旅叛乱羞辱怪物猎人世界辐射4武装原型LEGO建造者之旅LEGO建造者之旅多半好评支持中文折扣价59LEGO建造冰雪复古传奇类游戏打金需要具备哪些条件?哈喽,大家好,今天来和大家分享一款冰雪复古这款游戏,这个服开了已经有一段时间了,但人气还是很高的,所有的游戏都不会缺少搬砖打金的玩家,传奇类游戏打金的玩家更多,那么要成为专业打金人和越南的比赛,像极了当下中国职业足球的缩影终于能稍微松口气了。在阿联酋沙迦体育场,中国男足凭借伤停补时最后一分钟武磊和王燊超联袂制造的进球,3比2绝杀越南,取得了2022国际足联卡塔尔世界杯亚洲区预选赛最后阶段(以下简称1iFIT推迟IPO募资6。46亿美元计划,欧美股市持续波动或是主因北京时间10月6日,据彭博社报道,健身器材制造商iFITHealthFitness(以下简称iFIT)宣布由于不利的市场条件,将推迟首次公开募股,公司将继续评估拟议发行的时间。8月lululemon10月主题聚焦心理健康,还更加注重社交媒体运营今年年初发布全球幸福感报告后,lululemon在中国市场推出了10月新的主题心悦十月,社交媒体在其中承担了更多的角色。首个活动是一场围绕幸福感话题的直播讨论。10月9日,lulu东鹏特饮跨入咖啡行业,可能对酒饮也有兴趣在能量饮料外,东鹏特饮母公司东鹏饮料集团还在陆续尝试新的产品线,最新的尝试是咖啡。据和讯网10月8日报道,东鹏特饮母公司东鹏饮料集团推出了即饮咖啡品牌大咖。目前,大咖旗下的产品摇摇S11再掀电竞营销热,绝杀越南后武磊又宣新代言DEAL传统体育正处在大赛间的空隙,近期最受关注的赛事非S11莫属,电竞也确实在最近的体育营销中扮演了重要角色,养生品牌日用品甚至漫威都开始试图用电竞吸引新受众。而在消费端,越来越多非体育TopShot开发商DapperLabs与杜兰特合作,未来将发布视频内容和NFT产品北京时间10月13日,NBATopShot开发商DapperLabs与布鲁克林篮网队球员凯文杜兰特(KevinDurant)以及体育媒体公司Boardroom达成了为期两年的协议,银保监会丰富人身保险产品供给,探索开发学生运动意外伤害保险产品北京时间10月15日,中国银行保险监督管理委员会官网发布关于进一步丰富人身保险产品供给的指导意见(以下简称意见)。意见表示将从多领域丰富人身保险产品供给,加大特定人群保障力度。其中