值与可变位置分开

不可变数据把某一个值视为建立后保持不变的对象。程序仍可让名字指向新值,也可以在别处保存不断变化的状态;限制的是旧值本身不会被原地改写。这样,一个计算拿到某个集合以后,不必担心另一个操作悄悄把这一份集合的内容换掉。

参考:[1]

更新得到新的版本

向不可变集合增加元素,逻辑结果是一个新集合,原集合继续存在。若实现每次复制全部内容,成本会很高;持久化数据结构可以共享未改变的节点,只重建受影响的路径。共享是实现方法之一,不改变对使用者提供的新旧值彼此独立、不会相互原地修改的语义。

参考:[2]

并发中的可预测输入

多个任务读取同一个不可变值时,不必为防止读到一半遭原地修改而争用写锁。系统依然需要协调何时把共享引用换成新值,以及各项业务动作的先后。不可变数据减少了一类共享状态问题,却不自动解决任务调度、外部文件写入或跨系统的一致性。

参考:[1]

保留历史也要付成本

旧版本能用于撤销、比较和重放,但保留引用也会让相关结构继续存活。不可变容器内部若包含可变对象,还需要说明所谓不变限制到了哪一层。选择数据表示时,要同时考虑结构共享、对象边界和历史保留策略,不能只看到方便回看,就假定版本保存不占任何内存。

参考:[2]