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

来源:2-5 ThreadLocal场景分析——减少同步

mate_j

2020-01-19 16:02

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

写回答 关注

4回答

  • 无名点
    2020-01-19 17:02:04
    已采纳

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

    Aset值为3

    Bset值为4

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

    Eri1c

    不准确,要A和B落入同一个solt的情况下,后set的值在并发下被先set的值所覆盖才算非预期行为,而先set的被覆盖是正确的行为

    2020-02-06 16:47:45

    共 3 条回复 >

  • 求老仙
    2020-01-24 18:17:50

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

  • 矢风快乐
    2020-11-19 14:33:39

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

    qq_依然很...

    对,我感觉没线程安全问题啊

    2021-05-10 23:04:08

    共 1 条回复 >

  • 慕斯卡6586063
    2020-02-26 12:08:11

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

ThreadLocal

设计者视角源码级ThreadLocal分析教你建立线程安全感-你专属的技术优越感

14042 学习 · 31 问题

查看课程

相似问题