人们通常说,不可变的数据结构对并发编程更“友好”。解释是,如果一个数据结构是可变的,并且一个线程修改了它,那么另一个线程将“看到”该数据结构的前一个模式。
虽然不可能修改不可变的数据结构,但如果需要更改它,可以创建一个新的数据结构,并为其提供“旧”数据结构的引用。
在我看来,这种情况也不是线程安全的,因为一个线程可以访问旧的数据结构,另一个线程可以访问新的数据结构。如果是这样的话,为什么不可变的数据结构被认为是更线程安全的?
发布于 2016-08-14 23:24:54
这里的想法是,一旦创建了对象,就不能再更改它。作为某种结构一部分的每个对象本身都是不可变的。当您创建新结构并重用旧结构的一些组件时,您仍然不能更改组成此新结构的任何组件的任何内部值。您可以很容易地通过其根组件引用来识别每个结构。
当然,您仍然需要确保以线程安全的方式交换它们,这通常是使用CAS (比较和交换)指令的变体来完成的。或者你可以使用函数式编程,它的函数习惯用法没有副作用(接受不变的输入并产生新的结果),是线程安全、多线程编程的理想选择。
与可变性相比,不可变性有很多好处,但这并不意味着不可变性总是更好。每种方法都有它的优点和应用。有关不变性用法的更多详细信息,请查看this answer。另外,请查看this在某些情况下关于可变性好处的漂亮的书面答案。
https://stackoverflow.com/questions/38943521
复制相似问题