设计模式之单例模式

单例模式

  1. 单例模式(Singleton)是设计模式中最常见、最简单的模式之一 ,属于构建/建造型模式

  2. 设计模式(design pattern):针对软件开发过程中的某一类问题形成的方案。到目前为止,在软件开发过程中,有上百种设计模式,其中比较常用的有24种

  3. 单例模式,顾名思义,指的是在全局只存在唯一的一个实例对象

  4. 单例模式有六种实现方式:饿汉式懒汉式 、单重所、双重锁(DCL)、枚举式、内部类式

    1. 饿汉式

      java 复制代码
      public class A {
          // 在类中准备好一个对象,希望所有的使用者都只用准备号的唯一对象
          // 饿汉式:在定义对象的时候就初始化对象
          // 缺点:无论是否需要使用这个对象,在第一次调用这个类的时候都会初始化这个对象,从而增长了类的加载时间
          // 优点:没有线程的并发问题 - 类只加载一次,所以静态对象也只初始化一次
          private static final A a = new A();
          // 不允许在类外随便创建对象 - 构造函数私有化
          private A(){}
          public static A get(){return a;}
      }
    2. 懒汉式

      java 复制代码
      public class A {
          
          // 懒汉式:在定义对象的时候不初始化对象,而是在第一次调用方法的时候再初始化这个对象
          // 优点:在有需要的时候才会初始化对象,从而缩短了类的加载时间
          // 缺点:会产生线程的并发问题
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null) a = new A();
              return a;
          }
      }
    3. 单重锁

      java 复制代码
      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              // 优点:保证线程的并发安全
              // 缺点:锁本质上就是保证线程的"独占",因此加锁和解锁都需要消耗资源
              // 当对象被初始化之后,后续的所有的线程都需要先加锁,然后判断是否为空,再解锁,也就意味着所有的线程都需要经历锁的过程
              synchronized(A.class){
                  if(a == null) a = new A();
              }
              return a;
          }
      }
    4. 双重锁(DCL - Double Check Lock)

      java 复制代码
      public class A {
          
          private static A a;
         
          private A(){}
          public static A get(){
              if(a == null){
                  synchronized(A.class){
                  	if(a == null){
                      	synchronized(A.class){
                              a = new A();
                          }
                      }
              	}
              }
              return a;
          }
      }
    5. 枚举式

      java 复制代码
      enum A{
          a
      }
    6. 内部类式

      java 复制代码
      public class A {
          
          public static class AI{
              private static final AI instance = new AI();
          }
          
          public static AI getInstance(){
              return AI.instance;
          }
          
      }
相关推荐
李广坤7 小时前
状态模式(State Pattern)
设计模式
李广坤8 小时前
观察者模式(Observer Pattern)
设计模式
李广坤9 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤9 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤10 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,13 小时前
java23种设计模式之前言
设计模式
Asort13 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机14 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の16 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom1 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式