Joh*_*thy 25 java concurrency hashmap thread-safety
正如许多人已经注意到并遇到的那样,HashMap.put当同时使用时可以进入无限执行循环(参见GRIZZLY-1207,JGRP-525,可能是HHH-6414,以及这个SO 答案).
HashMap清楚地记录为不是线程安全的.显然,正确的解决方法是使用一个线程安全的实现Map,ConncurrentHashMap尤其如此.我对导致无限循环的并发时序更加好奇.我最近使用Java 7 JRE遇到了这个循环,并想了解确切的原因.例如,这是由同时多次看跌引起的吗?
在HashMap.put中查看显示HashMap.Entry包含指向下一个节点的链接(在存储桶中?).我假设这些链接正在腐蚀以包含循环引用,这导致无限循环.但是,我仍然不明白腐败是如何发生的.
Mar*_*ace 33
与许多人的想法相反,主要问题是multi-threading并且HashMaps不仅仅是一个重复的条目或一个消失的...正如你所说,当两个或多个Threads同时决定调整大小时,可能会发生无限循环HashMap.
如果HashMap的大小超过了给定的阈值,则多个线程可能最终同时尝试调整它的大小,如果我们足够幸运(您已经在生产中部署了代码),它们将永远继续...
问题是由实现void resize(int newCapacity);和void transfer(Entry[] newTable);实现的方式引起的,您可以自己查看openjdk源代码.运气不好,计时良好,条目反转(在这个数据结构中不需要排序),最终错误地互相引用,同时一个线程继续while(e != null)...
虽然我可以尝试自己给你一个解释,但我想赞扬保罗泰玛的帖子(我不能做得比他好),在那里我第一次学会了如何解决这个问题我决定弄清楚为什么我不是几个月前被雇用了......
http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
正如保罗所说,描述这场比赛的最好词是条件是: beautiful
| 归档时间: |
|
| 查看次数: |
9061 次 |
| 最近记录: |