疑问。1.8中的hashmap并发问题

[复制链接]
查看11 | 回复7 | 2021-1-27 06:32:09 | 显示全部楼层 |阅读模式
先前,简单了看了一下hashmap的源码。发现hashMap与1.7不同,并发下感觉并不会产生resize时的环链。而且也没有使用头插法。那是不是说并发下,是安全的?
我不是很理解,请前辈指点,hasmAp在并发下的问题。

不甚感激。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
hashmap无论1.7还是1.8都是线程非安全的,
1.8的resize改变在于元素多余8个的时候,从链表转成红黑树,
如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
引用1楼u011619071的回复:hashmap无论1.7还是1.8都是线程非安全的,
1.8的resize改变在于元素多余8个的时候,从链表转成红黑树,
如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap

要实现HashMap线程安全,最好是使用ConcurrentHashMap,1.6用的分段锁,1.8用的cas,HashTable和内部类synchronizedMap性能太差。。。
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
引用1楼u011619071的回复:hashmap无论1.7还是1.8都是线程非安全的,
1.8的resize改变在于元素多余8个的时候,从链表转成红黑树,
如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap


我就是想知道1.8中的并发会产生什么问题?我不懂啊应该1.7不一样吧
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层


有前辈吗
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
引用3楼qq_38951372的回复:Quote: 引用1楼u011619071的回复:
hashmap无论1.7还是1.8都是线程非安全的,
1.8的resize改变在于元素多余8个的时候,从链表转成红黑树,
如果要实现hashmap线程安全,可以采用加锁的方式,或者synchronizedMap


我就是想知道1.8中的并发会产生什么问题?我不懂啊应该1.7不一样吧

1.楼主先尝试如何在多线程下触发hashmap的非线程安全的调用。思路让hashmap发生resize,非常容易触发线程问题。
2.因为resize过程涉及到hashmap部分资源的变化,而线程没有保证这部分资源的实时可见性,
例如出现这样的场景:
A线程操作hashmap过程中出现了resize。而这时候B线程(没有触发resize)仍在向hashmap中put数据。最后结果就是出现的线程安全问题。


回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
1、可能会抛出异常,fail-fast。
2、可能会产生数据不一致问题。

回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
多线程编程中使用java.util.concurrent.ConcurrentHashMap
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行