JDK设计篇--不变模式

阅读更多

说设计模式,如果只是讲理论,估计很多人都会理解不透彻,今天我们结合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,确保一次设置后不会再被修改


JDK设计篇--不变模式_第1张图片
 
JDK设计篇--不变模式_第2张图片
 
我们可以看到,在Boolean和String类中,不可变的属性都被用private final修饰,保证属性设置为私有,且只被设置一次.

③去掉属性的setter方法以及所有可以修改对象属性的方法


JDK设计篇--不变模式_第3张图片
 ④有一个可以创建完整对象的构造函数.


JDK设计篇--不变模式_第4张图片

 

从以上可以看出,基本数据类型的包装类都是用不变模式实现的.所以,想学习不变模式,那就看基本包装类吧.

 

  • JDK设计篇--不变模式_第5张图片
  • 大小: 4.5 KB
  • JDK设计篇--不变模式_第6张图片
  • 大小: 11.4 KB
  • JDK设计篇--不变模式_第7张图片
  • 大小: 21.5 KB
  • JDK设计篇--不变模式_第8张图片
  • 大小: 18.4 KB
  • JDK设计篇--不变模式_第9张图片
  • 大小: 36.5 KB
  • 查看图片附件

你可能感兴趣的:(设计模式,高并发)