单例模式用于一个类只能有一个实例的场景,单例模式有两种,懒汉式和饿汉式单例模式。
单例模式核心,将构造函数私有化,只允许类自己创建实例,并通过公共方法提供给外部类。
1、懒汉式
public class LazySingleton { private static LazySingleton instance = null; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { synchronized (LazySingleton.class) { if (instance == null) { instance = new LazySingleton(); } } } return instance; } }
2、饿汉式
public class HungrySingleton { private static HungrySingleton instance = new HungrySingleton(); private HungrySingleton() {} public static HungrySingleton getInstance() { return instance; } }
第一种方法,有一个缺陷,就是 JVM 可能会乱序执行;改进后的代码如下:
public class LazySingleton { private volatile static LazySingleton INSTANCE; private LazySingleton() {} public static LazySingleton getInstance() { if (INSTANCE == null) { synchronized (LazySingleton.class) { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } } } return INSTANCE; } }