设计模式之避免共享的设计模式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对象,它的状态就是不可变的,不能被改变。

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

更多

有错误欢迎大家指正

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小阳小朋友

随便吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值