说设计模式,如果只是讲理论,估计很多人都会理解不透彻,今天我们结合JDK的源码设计,一块来说下设计模式中的不变模式.
1.什么是不变模式?
在并发程序中,为了保证临界区资源使用时不受其他线程干扰,使用锁控制可能是必不可少的,而同步锁控制会使系统的性能有所下降,为了尽可能提高并行程序的性能,我们可以使用一种不可改变的对象,依靠对象的不可变性,从而实现去锁操作,可以确保在多线程高并发情况下可以保持临界区资源的一致性,这就是不变模式.
说白了,不变模式,就是在对象创建完成后,不能再改变(我突然想起了小时候拉钩说的话),它的核心思想就是,一个对象一旦被创建,则它的内部状态就不允许再改变,基于这些特性,我们可以确定,不变模式对多线程是友好的,不需要进行同步锁控制.
2.不变模式的使用场景
根据不变模式的定义,我们可以大概猜出不变模式的应用场景:
①当对象创建后,不允许其他外部环境修改其内部状态和数据
②对象可以共享,即在多线程高并发情况下,可以被频繁访问.
不变模式在JDK中的应用很广泛,我们常用的String类,以及基本数据类型的包装类,如Integer,Boolean等等,都是使用不变模式实现的.那不变模式有哪些特征呢?
3.不变模式的实现特征
①类被定义为final,即该类不存在子类,也就防止了子类重载后修改父类的方法.[如public final class String]
②将所有的属性设置为private final,确保一次设置后不会再被修改
③去掉属性的setter方法以及所有可以修改对象属性的方法
④有一个可以创建完整对象的构造函数.
以上4点,我们使用String类来说明不变模式的实现.
4.源码展示
在JDK中,不变模式的应用很广泛,我们使用String类来说明,其他类如包装类的源码类似,大家可以自行研究.
①类被定义为final,即该类不存在子类,也就防止了子类重载后修改父类的方法.
在String类中,我们看下它的定义.
很明显,String类被定义为了不可变类,有不清楚final的,大家可以去看Java基础.
②将所有的不可变属性设置为private final,确保一次设置后不会再被修改
我们可以看到,在Boolean和String类中,不可变的属性都被用private final修饰,保证属性设置为私有,且只被设置一次.
③去掉属性的setter方法以及所有可以修改对象属性的方法
从以上可以看出,基本数据类型的包装类都是用不变模式实现的.所以,想学习不变模式,那就看基本包装类吧.