单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式特点:
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有的其他对象提供这一实例
示例代码
1 | public class SingleObject { |
根据上面的代码,外界只能通过静态方法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
14public 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
9public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}