mate_j
2020-01-19 16:02
您好,我能够明白set是所有线程共享的,是个临界区。但是什么情况下会发生线程安全问题呢?
A和B同时调用了这个set方法B比A慢一点,但都是在调用这个方法
Aset值为3
Bset值为4
那么Aset的值就会就会被覆盖,为Bset的值4,最终结果就是Aset的值丢失,线程不安全
上面同学解释很好了。 大家看java文档的时候, 会有线程安全的说明, 大部分数据结构都不是线程安全的。
这里我也没想明白。mate_j 说的我并不认同,ThreadLocal.withInitial的方法调用不应该是线程独立的么?HashSet在这里只是add,没有其他额外操作,多个线程只是操作先后问题(即使同时,这2个对象也可以被加进去吧,除非jvm这里能new出2个一样的对象)。即时同时方法调用,也是方法同时进入2个线程栈,也可以将对应的元素加入到set.可以的话,还请讲师答疑解惑。多线程这块这些细节确实不好理解。
我认为HashSet是底层是HashMap实现的,而HashMap不是线程安全的,HashMap是由数组+链表/红黑树。具体线程安全问题应该是A和B被放置在数组的同一个位置,B把A的值覆盖了
ThreadLocal
14042 学习 · 31 问题
相似问题