`

JDK设计篇--不变模式

    博客分类:
  • 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,确保一次设置后不会再被修改



 

 
我们可以看到,在Boolean和String类中,不可变的属性都被用private final修饰,保证属性设置为私有,且只被设置一次.

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



 ④有一个可以创建完整对象的构造函数.


 

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

 

  • 大小: 4.5 KB
  • 大小: 11.4 KB
  • 大小: 21.5 KB
  • 大小: 18.4 KB
  • 大小: 36.5 KB
分享到:
评论

相关推荐

    bcprov-jdk15on-1.59-API文档-中英对照版.zip

    赠送jar包:bcprov-jdk15on-1.59.jar; 赠送原API文档:bcprov-jdk15on-1.59-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    bcprov-jdk15on-1.68-API文档-中文版.zip

    赠送jar包:bcprov-jdk15on-1.68.jar; 赠送原API文档:bcprov-jdk15on-1.68-javadoc.jar; 赠送源代码:bcprov-jdk15on-1.68-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcmail-jdk15on-1.58,bcprov-jdk15on-1.58,bcpkix-jdk15on-1.58

    "jdk15on"表示这个版本是针对Java 1.5及以上版本设计的,因此可以在较新的Java环境中运行。版本号"1.58"意味着这是该库的第1.58次更新,通常包含了一些bug修复、性能优化和新特性的添加。 "bcpkix-jdk15on-1.58.jar...

    bcprov-jdk15on-1.60-API文档-中文版.zip

    赠送jar包:bcprov-jdk15on-1.60.jar; 赠送原API文档:bcprov-jdk15on-1.60-javadoc.jar; 赠送源代码:bcprov-jdk15on-1.60-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcprov-jdk15on-1.52-API文档-中文版.zip

    赠送jar包:bcprov-jdk15on-1.52.jar; 赠送原API文档:bcprov-jdk15on-1.52-javadoc.jar; 赠送源代码:bcprov-jdk15on-1.52-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcprov-jdk15on-1.59-API文档-中文版.zip

    赠送jar包:bcprov-jdk15on-1.59.jar; 赠送原API文档:bcprov-jdk15on-1.59-javadoc.jar; 赠送源代码:bcprov-jdk15on-1.59-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcpkix-jdk15on-1.68-API文档-中英对照版.zip

    赠送jar包:bcpkix-jdk15on-1.68.jar; 赠送原API文档:bcpkix-jdk15on-1.68-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    bcprov-ext-jdk15on-152和bcprov-jdk15on-152

    标题中的"bcprov-ext-jdk15on-152"和"bcprov-jdk15on-152"是两个与Bouncy Castle库相关的Java档案文件,它们主要用于提供加密和安全服务。Bouncy Castle是一个开源的Java安全提供者,广泛用于密码学应用,包括加密、...

    bcprov-jdk15on-1.54.jar bcprov-ext-jdk15on-1.54.jar下载

    2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext 3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。

    bcpkix-jdk15on-1.68-API文档-中文版.zip

    赠送jar包:bcpkix-jdk15on-1.68.jar; 赠送原API文档:bcpkix-jdk15on-1.68-javadoc.jar; 赠送源代码:bcpkix-jdk15on-1.68-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcpkix-jdk15on-1.56/bcprov-jdk15on-1.56

    bcpkix-jdk15on-1.56 好用

    bcprov-jdk15on-1.60-API文档-中英对照版.zip

    赠送jar包:bcprov-jdk15on-1.60.jar; 赠送原API文档:bcprov-jdk15on-1.60-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    bcprov-jdk15on-1.68-API文档-中英对照版.zip

    赠送jar包:bcprov-jdk15on-1.68.jar; 赠送原API文档:bcprov-jdk15on-1.68-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar

    该压缩文件包含bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar,bcprov-jdk15on-154中移除了一些加密算法,bcprov-ext-jdk15on-154中依然保留。可以解决JDK1.6 HttpClient访问https网页报的错

    bcprov-jdk15on-1.54.jar中文文档.zip

    (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <groupId>org.bouncycastle <artifactId>bcprov-jdk15on *** ``` # Gradle依赖: `...

    bcpkix-jdk15on-1.59-API文档-中文版.zip

    赠送jar包:bcpkix-jdk15on-1.59.jar; 赠送原API文档:bcpkix-jdk15on-1.59-javadoc.jar; 赠送源代码:bcpkix-jdk15on-1.59-sources....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    bcpkix-jdk15on-1.60-API文档-中英对照版.zip

    赠送jar包:bcpkix-jdk15on-1.60.jar; 赠送原API文档:bcpkix-jdk15on-1.60-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    bcprov-ext-jdk15on-1.52和bcprov-jdk15on-1.52

    标题中的"bcprov-ext-jdk15on-1.52"和"bcprov-jdk15on-1.52"是两个不同版本的Java软件包,它们都是由The Legion of the Bouncy Castle(Bouncy Castle)组织提供的加密库。Bouncy Castle是一个广泛使用的开源Java...

    bcprov-jdk15on-1.60.jar中文文档.zip

    (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <groupId>org.bouncycastle <artifactId>bcprov-jdk15on *** ``` # Gradle依赖: `...

Global site tag (gtag.js) - Google Analytics