如果一个线程改变其中一个并发集合中已有的对象,则提供哪些保证



如果线程 1 将可变对象 A 放入并发集合中,例如 ConcurrentSkipListMap,我知道这是线程安全的,因为如果线程 2 从集合中获取对象 A,则保证它是完全可见的。

但是,如果线程 1 在集合中具有突变的对象 A,则通过线程 2 获取它是否仍然提供相同的完全可见性保证?

但是,如果线程 1 在集合中具有突变的对象 A,则通过线程 2 获取它是否仍然提供相同的完全可见性保证?

不,绝对不是。并发保证仅适用于集合本身。一旦你从集合中获取了元素,它只是一个正常方式的引用 - 所以即使在"get"操作结束时存在内存屏障,仍然有可能出现类似这样的情况:

 Thread 1                   Thread 2
   get
                              get
                              mutate
   read

。在两次get操作都发生后,收集就无关紧要了。

并发集合应用于:

  • 不可变类型,从多个线程自然可以安全使用
  • 可变但永不变异的类型
  • 应用显式同步等以确保安全的类型

相关内容

  • 没有找到相关文章

最新更新