Immutability 是编程语言中的一个概念,它指的是在创建数据结构之后,不能对其进行修改。当需要对数据进行更改时,函数式编程要求创建一个新的数据结构,而保持原始数据结构不变。

我之前一直觉得 immutability 是吃饱了撑的,因为不可变性意味着会存在多份相似的数据,内存开销会急剧增大,而且如果是一个非常庞大的数据结构,那么每次小修改都会导致其完全拷贝。

不过学了这么多系统知识后,我突然发现其实不可变性和 Optimistic Lock vs Pessimistic Lock 中的乐观锁很像,每一个版本都是不可变的,这样并发度就会提高,编程难度还会下降。

此外需要强调的是,不可变性并不意味着程序语言中的每个“变量”都是不可变的,这种语言里面的“引用”还是可以变化的,只是数据本身是不可变的。这是我之前模糊的点,因为数据本身可能就包含引用,所以如果数据是不可变的,那么引用也应该不可变啊。我到现在都没有思考清楚这个问题。

我上面的这段疑问,是典型的不了解 函数式编程 中的 binding 概念导致的。与 C 语言不同,函数式编程中是没有“变量”的概念的。相应的,只有“reference”和“object”的概念,将 reference 与 object 联系起来的操作,就是 binding 。所谓的不可变性,指的是 object 的不可变性。而 reference 因为 binding 而导致的改变,是允许的。仔细思考就会发现,实际上容易产生并行冲突的,是 object 的改变(真正的共享数据),而不是 reference(谁家好人共享 reference 呀)。