单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
单例模式往往会有线程安全问题,所以一般有以下两种方式
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 变量。