LunarRoom

单例模式

字数统计: 683阅读时长: 2 min
2020/05/07 Share

单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式特点:

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有的其他对象提供这一实例

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingleObject {

//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject();

//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}

//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}

public void showMessage(){
System.out.println("Hello World!");
}
}

根据上面的代码,外界只能通过静态方法getInstance()来获取实例,获取到的实例是静态。

单例模式的几种实现方式

懒汉式和饿汉式暂时不写了

  • 双重检验锁(Double-checked locking)

    • 第一重检验:只有在实例对象为null即instance == null的时候继续运行实例化代码。
    • 第二重:通过synchronized关键字锁定实例化的代码,使最快的那条线程能够进入实例化的过程,保证线程安全。
    • 与懒汉式相比,加入了判断instance是否为null的检验机制。使得getInstance方法不为synchronized方法,因为线程锁机制效率比较低。而这个方法只需要在实例化的时候进行线程锁,效率比较高。

    实例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Singleton {  
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton() {
    if (singleton == null) {
    synchronized (Singleton.class) {
    if (singleton == null) {
    singleton = new Singleton();
    }
    }
    }
    return singleton;
    }
    }
  • 登记式/静态内部类

    描述:这个方式和饿汉式很想,都是通过ClassHolder机制来保证线程安全。ClassHolder即在类加载时就实例化instance对象,没有了在getInstance方法调用时多个线程同时调用导致实例化多个对象的烦恼。** 而与饿汉式的区别就是加入了一个静态内部类ClassHolder,静态内部类有一个静态instance对象。只有在调用getInstance方法时才调用ClassHolder的静态instance对象,就保证了本类在其他地方用的时候也实例化instance对象,节约了资源。

    实例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Singleton {  
    private static class SingletonHolder {
    private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
    return SingletonHolder.INSTANCE;
    }
    }
CATALOG
  1. 1. 单例模式
    1. 1.1. 示例代码
    2. 1.2. 单例模式的几种实现方式