[关闭]
@linux1s1s 2017-01-09T15:44:24.000000Z 字数 1001 阅读 1565

Forward Time-Immutable & Mutable

Forward 2017-01


基本概念

Immutable ---> const
Mutable ---> variable

为了直观理解上面的概念,可以尝试回答下面的问题:

JAVA 中为什么String 是immutable的

先来看看Java代码对应的内存分布:

  1. String string1 = "abcd";
  2. String string2 = "abcd";

内存分布如下:

此处输入图片的描述

所以,如上图所示,如果此时改变变量string1的值,string2变量如何变化?

  1. string1 = "defg";

请问string2 变量会随之改变吗?

此处输入图片的描述

我们发现string2并没有改变,这就是Immutable的基本特性。
但是如果Java中的String不是Immutable的话,会发生什么?

很显然string1的改变会影响到string2,这就是一例证明Mutable不可控的例证,正如下面的话所说:

Shared mutable state is the root of all evil(共享的可变状态是万恶之源)
-- Pete Hunt

Immutable 降低了 Mutable 带来的复杂度

另外在Java中,很多方法的参数都是String型的,如果String是Mutable,那么很容易导致该参数在执行完一段代码以后,发生莫名其妙的改变,其效果等同于下面的一段JS代码

  1. function touchAndLog(touchFn) {
  2. let data = { key: 'value' };
  3. touchFn(data);
  4. console.log(data.key); // 猜猜会打印什么?
  5. }

在不查看 touchFn 的代码的情况下,因为不确定它对 data 做了什么,你是不可能知道会打印什么(这不是废话吗)。但如果 data 是 Immutable 的呢,你可以很肯定的知道打印的是 value。

因此:可变(Mutable)数据耦合了 Time 和 Value 的概念,造成了数据很难被回溯。

所以: Immutable 降低了 Mutable 带来的复杂度

并发安全

传统的并发非常难做,因为要处理各种数据不一致问题,因此『聪明人』发明了各种锁来解决。但使用了 Immutable 之后,数据天生是不可变的,并发锁就不需要了。

对于Immutable在JS的表现,我们暂且不表,留待后续展开。

参考:
Immutable 详解及 React 中实践
JAVA 中为什么String 是immutable的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注