为了账号安全,请及时绑定邮箱和手机立即绑定

20行为什么会有线程安全问题

您好,我能够明白set是所有线程共享的,是个临界区。但是什么情况下会发生线程安全问题呢?

正在回答

4 回答

A和B同时调用了这个set方法B比A慢一点,但都是在调用这个方法

Aset值为3

Bset值为4

那么Aset的值就会就会被覆盖,为Bset的值4,最终结果就是Aset的值丢失,线程不安全

2 回复 有任何疑惑可以回复我~
#1

qq_奥斯卡罗严塔尔_0

我认为不对 每一个 new 出来的对象 地址不同 所以即使 是临界区也不会被覆盖
2020-01-21 回复 有任何疑惑可以回复我~
#2

qq_蒙牛_0 回复 qq_奥斯卡罗严塔尔_0

我同意你的观点,我做了实验,把synthesized关键字去掉之后结果也是正确的,感觉视频作者举的例子不是很恰当。(或者有更高深的见解?请大佬指教)
2020-01-29 回复 有任何疑惑可以回复我~
#3

Eri1c

不准确,要A和B落入同一个solt的情况下,后set的值在并发下被先set的值所覆盖才算非预期行为,而先set的被覆盖是正确的行为
2020-02-06 回复 有任何疑惑可以回复我~

上面同学解释很好了。  大家看java文档的时候, 会有线程安全的说明, 大部分数据结构都不是线程安全的。 

2 回复 有任何疑惑可以回复我~

这里我也没想明白。mate_j 说的我并不认同,ThreadLocal.withInitial的方法调用不应该是线程独立的么?HashSet在这里只是add,没有其他额外操作,多个线程只是操作先后问题(即使同时,这2个对象也可以被加进去吧,除非jvm这里能new出2个一样的对象)。即时同时方法调用,也是方法同时进入2个线程栈,也可以将对应的元素加入到set.可以的话,还请讲师答疑解惑。多线程这块这些细节确实不好理解。

0 回复 有任何疑惑可以回复我~
#1

qq_依然很潇洒_0

对,我感觉没线程安全问题啊
2021-05-10 回复 有任何疑惑可以回复我~

我认为HashSet是底层是HashMap实现的,而HashMap不是线程安全的,HashMap是由数组+链表/红黑树。具体线程安全问题应该是A和B被放置在数组的同一个位置,B把A的值覆盖了

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

20行为什么会有线程安全问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信