通常说不可变数据结构对于并发编程更“友好”。解释是,如果数据结构是可变的并且一个线程修改它,那么另一个线程将“看到”数据结构的先前模式。
虽然无法修改不可变数据结构,但如果需要更改它,可以创建一个新的数据结构并为其提供“旧”数据结构的引用。
在我看来,这种情况也不是线程安全的,因为一个线程可以访问旧的数据结构,第二个线程可以访问新的数据结构。如果是这样,为什么不可变数据结构被认为更加线程安全?
答案 0 :(得分:2)
这里的想法是,一旦创建了对象,就无法对其进行更改。作为某种结构一部分的每个对象本身都是不可变的。当您创建新结构并重用旧结构的某些组件时,您仍然无法更改构成此新结构的任何组件的任何内部值。您可以通过其根组件引用轻松识别每个结构。
当然,您仍然需要确保以线程安全的方式交换它们,这通常使用CAS(比较和交换)指令的变体来完成。或者你可以使用函数式编程,这些函数没有副作用(采用不可变输入并产生新结果)是线程安全,多线程编程的理想选择。
不可变性对可变性有很多好处,但这并不意味着不可变性总是更好。每种方法都有其优点和应用。有关不变性使用的更多详细信息,请查看this answer。在某些情况下,还要检查this关于可变性福利的精美书面答案。