问答详情
源自:2-5 ThreadLocal场景分析——减少同步

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

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

提问者:mate_j 2020-01-19 16:02

个回答

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

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

    Aset值为3

    Bset值为4

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

  • 求老仙
    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.可以的话,还请讲师答疑解惑。多线程这块这些细节确实不好理解。

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

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