单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
单例模式往往会有线程安全问题,所以一般有以下两种方式
1.静态内部类的方式
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}利用了 classloader 机制来保证初始化 instance 时只有一个线程访问。因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。
2.双重检查锁定
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}在这个实现中,我们首先检查 instance 是否为 null,如果是,我们就使用同步块来确保只有一个线程可以访问该块。在同步块内部,我们再次检查 instance 是否为 null,如果是,我们就创建一个新的 Singleton 实例并将其赋值给 instance。最后,我们返回 instance。
这种实现是线程安全的,并且不会影响性能。我们还使用了 volatile 关键字来确保多个线程可以正确地处理 instance 变量。