博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(二) 单例模式
阅读量:5320 次
发布时间:2019-06-14

本文共 2061 字,大约阅读时间需要 6 分钟。

定义

单例模式是一种对象创建型模式。GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访

问的全局访问方法。

使用单例模式的原因

  • 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象。

  • 在整个程序空间使用全局变量,共享资源。

  • 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

单例模式实现

  1. 饿汉式:在单线程和多线程中均无问题。

    public class Person {    public static final Person person = new Person();    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    //构造函数私有化    private Person() {    }    //提供一个全局的静态方法    public static Person getPerson() {        return person;    }}
  2. 懒汉式:多线程中不能保证唯一的对象。若在多线程中使用懒汉式,可用2.1 、2.2 方式。

    public class Person2 {     private String name;     private static Person2 person;     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     //构造函数私有化     private Person2() {     }     //提供一个全局的静态方法     public static Person2 getPerson() {         if(person == null) {             person = new Person2();         }         return person;     } }

    2.1 添加synchronized的懒汉式

    public class Person3 {     private String name;     private static Person3 person;     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     //构造函数私有化     private Person3() {     }     //提供一个全局的静态方法,使用同步方法     public static synchronized Person3 getPerson() {         if(person == null) {             person = new Person3();         }         return person;     } }

    2.2 双重检查

    public class Person4 {     private String name;     private static Person4 person;     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     //构造函数私有化     private Person4() {     }     //提供一个全局的静态方法     public static Person4 getPerson() {         if(person == null) {             synchronized (Person4.class) {                 if(person == null) {                     person = new Person4();                 }             }         }         return person;     } }

转载于:https://www.cnblogs.com/esileme/p/7561620.html

你可能感兴趣的文章
Linux设置环境变量的方法
查看>>
Atitit.进程管理常用api
查看>>
构建自己的项目管理方案
查看>>
利用pca分析fmri的生理噪声
查看>>
div水平居中且垂直居中
查看>>
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
原生JavaScript第六篇
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>