如果线程 1 将可变对象 A 放入并发集合中,例如 ConcurrentSkipListMap,我知道这是线程安全的,因为如果线程 2 从集合中获取对象 A,则保证它是完全可见的。
但是,如果线程 1 在集合中具有突变的对象 A,则通过线程 2 获取它是否仍然提供相同的完全可见性保证?
但是,如果线程 1 在集合中具有突变的对象 A,则通过线程 2 获取它是否仍然提供相同的完全可见性保证?
不,绝对不是。并发保证仅适用于集合本身。一旦你从集合中获取了元素,它只是一个正常方式的引用 - 所以即使在"get"操作结束时存在内存屏障,仍然有可能出现类似这样的情况:
Thread 1 Thread 2
get
get
mutate
read
。在两次get
操作都发生后,收集就无关紧要了。
并发集合应用于:
- 不可变类型,从多个线程自然可以安全使用
- 可变但永不变异的类型
- 应用显式同步等以确保安全的类型