不变性设计的局限性
关于不变性设计,其实很早前就存在,但由于当时并多线程和多核并未普及,而且软件的性能可通过直接升级计算机得以提升,也使其并未得到关注。但对于曾经多线程编程人员来说,这是相当深刻的。
不变性即不会改变,对于程序员表达一个变化的世界是不可思议的。在对象学上,这是一个关于无态的讨论。不变性使得我们可以只考虑某时刻的状态,而不需考虑之前或之后可能被其他线程所修改的状态,显著地提高并发能力。对于一个对象,我们不再需要把它锁起来,再一个个字段修改来保证原子性,通过替换对象即可,替换对象就是替换引用,这种换值操作本身就是原子的。这种方式很自然的屏蔽了变化过程,使得我们思考时可以很轻松地思考那些对我们有意义的“状态”。
当我们感受多么美好的时候,却发现一个问题:试想这么一个状况,整个对象集合是关系密切的,每次更改都会产生全集变化,若果使用不变性,将会使得整个集合被替换,当我们试想这个集合就是数据库的时候,这种开销不敢想象。当我们想一个对象内数据时刻是一致的,那么我们就把它设为不变的,若果我们想一个集合是时刻一致的,若果我们想一个数据库是时刻一致的,若果我们想整个硬盘的数据是时刻一致的……或者我们想太多了,但这个的确是我们不得不想的问题——不变到什么程度。
(待续)
[该贴被SpeedVan于2012-08-13 11:22修改过]