如果一个线程改变其中一个并发集合中的对象,会提供什么保证?

时间:2014-12-06 09:47:21

标签: java multithreading concurrency

如果第一个线程将可变对象A放入并发集合(如ConcurrentSkipListMap),我理解这是线程安全的,如果线程2'从集合中获取对象A,则保证完全可见。

但是,如果第一个线程在集合中有变异的对象A,那么通过线程2获取它仍然提供相同的完全可见性保证吗?

1 个答案:

答案 0 :(得分:2)

  

但是,如果第一个线程在集合中变异了对象A,那么通过线程2获取它仍然提供相同的完全可见性保证吗?

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

 Thread 1                   Thread 2

   get
                              get
                              mutate
   read

...并且在两次get操作发生后,集合都无关紧要。

并发集合应该用于:

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