ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

系列一、 单例设计模式

2026/10/1 4:43:17 拓冰建站 浏览量
系列一、 单例设计模式

一、单例设计模式

1.1、概述

        单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1.2、应用场景

        只需要一个实例,例如:各种Manager、各种Factory

二、单例模式的结构

2.1、单例模式主要有以下角色

  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类

2.2、单例模式的实现

  • 饿汉式:类加载就会导致该单例对象被创建
  • 懒汉式:类加载不会导致该单例对象被创建,当首次使用该对象时才会创建

2.3、单例模式-饿汉式

2.3.1、静态成员变量

public class SingletonDemo1 {// 1、私有构造方法private SingletonDemo1() {}// 2、在当前类中创建本类对象private static SingletonDemo1 instance = new SingletonDemo1();// 3、对外提供获取本类实例对象的公共访问方式public static SingletonDemo1 getInstance() {return instance;}
}

2.3.2、静态代码块

public class SingletonDemo2 {// 1、私有构造方法private SingletonDemo2() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo2 instance;// 3、在静态代码块中进行赋值static {instance = new SingletonDemo2();}// 4、对外提供获取该类对象的方法public static SingletonDemo2 getInstance() {return instance;}}

2.3.3、存在的问题

        由于对象的创建是随着类的加载而创建,所以存在内存浪费的问题。

2.4、单例模式-懒汉式

2.4.1、线程不安全

/*** * @Description 懒汉式:线程不安全* 存在的问题:多线程情况下,会创建多个实例*/
public class SingletonDemo3 {// 1、私有构造方法private SingletonDemo3() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo3 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static SingletonDemo3 getInstance() {if (instance == null) {instance = new SingletonDemo3();}return instance;}
}

2.4.2、线程安全

/*** @Description 懒汉式:线程安全* 存在的问题:*      对于getInstance()方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以我们没必要让每个线程必须持有锁才能调用该方法,*   而且加锁在多线程场景下,会严重影响性能。*/
public class SingletonDemo4 {// 1、私有构造方法private SingletonDemo4() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo4 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static synchronized SingletonDemo4 getInstance() {if (instance == null) {instance = new SingletonDemo4();}return instance;}}

2.4.3、双重锁检查机制【推荐】

/*** @Description 懒汉模式:双重锁检查机制*/
public class SingletonDemo5 {// 1、私有构造方法private SingletonDemo5() {}/*** 2、在当前类中声明当前类的类型变量* 说明:添加volatile关键字之后的双重检查锁模式是一种比较好的单例实现模式,能够保证在多线程的情况下线程安全,* 并且不会影响性能。*/private static volatile SingletonDemo5 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static SingletonDemo5 getInstance() {// 3.1、第一次判断,如果instance不为null,不需要抢占资源,直接返回if (instance == null) {synchronized (SingletonDemo5.class) {// 3.2、第二次判断if (instance == null) {instance = new SingletonDemo5();}}}return instance;}
}