代码之家  ›  专栏  ›  技术社区  ›  CrazySynthax

不可变对象的真正好处是什么

  •  1
  • CrazySynthax  · 技术社区  · 6 年前

    好吧,如果我有一个公司所有员工的不变列表,并且新员工被雇佣了,会发生什么?在这种情况下,必须复制不可变列表,新的副本必须包含另一个employee对象。然后引用员工名单应指向新名单。

    当这种情况发生时,列表本身不会改变,但是对这个列表的引用会改变,因此代码“看到”不同的数据。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Holger    6 年前

    可变数据并发更新的主要问题是线程可能会感知到来自不同版本的变量值,即一次更新时新旧值的混合,形成不一致的状态,违反了这些变量的不变量。

    例如,见Javas ArrayList int 保存当前大小的字段和对数组的引用,该数组的元素是所包含对象的引用。这些变量的值必须满足某些不变量,例如,如果大小非零,则数组引用永远不会 null NullPointerException ArrayIndexOutOfBoundeException ).

    contains ),然后再对其进行操作(如获取、添加或删除元素),而条件可能会在这两者之间发生变化。

    这与带有垃圾收集的编程语言一起工作得很顺利,因为这些语言允许新的数据结构引用旧对象,只需替换已更改的对象(及其父对象),而无需担心哪些对象仍在使用,哪些对象不在使用。

        2
  •  0
  •   uuu777    5 年前

    它不用锁也能工作。

    如果我们有多个writer线程,我们仍然需要一个write look。如果必须从列表中删除条目,则需要读写锁。

    有价值吗?不知道。