疑问。1.8中的hashmap并发问题

小燃儿 2017-11-14 03:39:19
先前,简单了看了一下hashmap的源码。发现hashMap与1.7不同,并发下感觉并不会产生resize时的环链。而且也没有使用头插法。 那是不是说并发下,是安全的?

我不是很理解,请前辈指点,hasmAp在并发下的问题。


不甚感激。
...全文
477 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
什么都不能 2017-11-15
  • 打赏
  • 举报
回复
多线程编程中使用 java.util.concurrent.ConcurrentHashMap
6点A君 2017-11-15
  • 打赏
  • 举报
回复
1、可能会抛出异常,fail-fast。 2、可能会产生数据不一致问题。
X元素 2017-11-15
  • 打赏
  • 举报
回复
引用 3 楼 qq_38951372 的回复:
[quote=引用 1 楼 u011619071 的回复:] hashmap无论1.7 还是1.8 都是线程非安全的, 1.8的resize改变在于元素多余8个的时候,从链表转成红黑树, 如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap
我就是想知道1.8中的并发会产生什么问题?我不懂啊 应该1.7不一样吧[/quote] 1.楼主先尝试如何在多线程下 触发hashmap的非线程安全的调用。思路让hashmap发生resize,非常容易触发线程问题。 2.因为resize过程涉及到hashmap部分资源的变化,而线程没有保证这部分资源的实时可见性, 例如出现这样的场景: A线程操作hashmap过程中出现了resize。而这时候B线程(没有触发resize)仍在向hashmap中put数据。最后结果就是出现的线程安全问题。
小燃儿 2017-11-15
  • 打赏
  • 举报
回复
有前辈吗
小燃儿 2017-11-14
  • 打赏
  • 举报
回复
引用 1 楼 u011619071 的回复:
hashmap无论1.7 还是1.8 都是线程非安全的, 1.8的resize改变在于元素多余8个的时候,从链表转成红黑树, 如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap
我就是想知道1.8中的并发会产生什么问题?我不懂啊 应该1.7不一样吧
李德胜1995 2017-11-14
  • 打赏
  • 举报
回复
引用 1 楼 u011619071 的回复:
hashmap无论1.7 还是1.8 都是线程非安全的, 1.8的resize改变在于元素多余8个的时候,从链表转成红黑树, 如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap
要实现HashMap线程安全,最好是使用ConcurrentHashMap,1.6用的分段锁,1.8用的cas,HashTable和内部类synchronizedMap性能太差。。。
X元素 2017-11-14
  • 打赏
  • 举报
回复
hashmap无论1.7 还是1.8 都是线程非安全的, 1.8的resize改变在于元素多余8个的时候,从链表转成红黑树, 如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧