设计模式之单例模式

单例模式

  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;
          }
          
      }
相关推荐
魅影骑士00101 天前
柯里化函数
后端·设计模式
BHXDML1 天前
Java 设计模式详解
java·开发语言·设计模式
Engineer邓祥浩1 天前
设计模式学习(12) 23-10 外观模式
学习·设计模式·外观模式
Geoking.1 天前
【设计模式】享元模式(Flyweight)详解:用共享对象对抗内存爆炸
java·设计模式·享元模式
callJJ1 天前
Spring设计模式与依赖注入详解
java·spring·设计模式·idea·工厂模式
sxlishaobin1 天前
设计模式之组合模式
设计模式·组合模式
ExiFengs1 天前
Java使用策略模式实现多实体通用操作的优雅设计
java·开发语言·设计模式·策略模式
茶本无香1 天前
设计模式之三—工厂模式:灵活对象创建的艺术
java·开发语言·设计模式·工厂模式
Yu_Lijing1 天前
基于C++的《Head First设计模式》笔记——命令模式
c++·笔记·设计模式
天“码”行空1 天前
java的设计模式-----------单例类
java·开发语言·设计模式