设计模式之避免共享的设计模式Immutability(不变性)模式

目录

  • 来源
  • 如何实现
  • 注意事项
  • 简单的例子
  • 更多

来源

多个线程同时读写同一共享变量存在并发问题,这里的必要条件之一是读写,如果只有读没有写,是没有并发问题的。解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。就是变量一旦被赋值,就不允许修改了(没有修改操作),也就是保持了不变性。


如何实现

需要注意Immutability模式的属性的不可变性

  • 将一个类所有的属性都设置成 final 的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。更严格的做法是这个类本身也是final的,也就是不允许继承。
  • jdk中很多类都具备不可变性,例如经常用到的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性,这些对象的线程安全性都是靠不可变性来保证的。它们都严格遵守了不可变类的三点要求:类和属性都是 final的,所有方法均是只读的。

注意事项

需要注意以下两点:

  • 对象的所有属性都是 final 的,并不能保证不可变性;
  • 不可变对象也需要正确发布。

在使用 Immutability 模式的时候一定要确认保持不变性的边界在哪里,是否要求属性对象也具备不可变性


简单的例子

不可变的Person类:

public final class Person {
    private final String name;
    private final int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

在这个示例中,Person类被声明为final,防止其他类扩展它。它有两私有的不可变字段nameage,它们被声明为final,这意味着它们一旦被初始化后就不能被修改。类中只有构造函数来初始化这些字段,并且提供了获取字段值的方法,但没有提供任何可以修改字段值的方法。因此,一旦创建了Person对象,它的状态就是不可变的,不能被改变。

这种不可变性模式有助于避免在程序中意外改变对象的状态,提高了系统的健壮性和安全性。

更多

  • 设计模式之并发特定场景下的设计模式 Two-phase
    Termination(两阶段终止)模式
  • 设计模式之单例模式的懒饿汉

有错误欢迎大家指正

你可能感兴趣的:(设计模式,设计模式,java,开发语言)