如果第一个线程将可变对象A放入并发集合(如ConcurrentSkipListMap),我理解这是线程安全的,如果线程2'从集合中获取对象A,则保证完全可见。
但是,如果第一个线程在集合中有变异的对象A,那么通过线程2获取它仍然提供相同的完全可见性保证吗?
答案 0 :(得分:2)
但是,如果第一个线程在集合中变异了对象A,那么通过线程2获取它仍然提供相同的完全可见性保证吗?
不,绝对不是。并发性保证仅适用于集合本身。一旦你从集合中获取了元素,它就会以正常的方式只是一个引用 - 所以即使在"结尾处有一个内存屏障。让"操作,仍有可能出现类似的情况:
Thread 1 Thread 2
get
get
mutate
read
...并且在两次get
操作发生后,集合都无关紧要。
并发集合应该用于: