方法一:匿名内部类,创建对象(线程安全)
/**
* 在内部类被加载和初始化时,才创建 INSTANCE 实例对象。
* 静态内部类不会自动随着外部类的初始化而初始化,它是要单独去加载和初始化的。
* 是线程安全的,因为是在内部类加载和初始化时,创建的
* @author 邓林妹
* @date 2022/5/16
*/
public class Singleton2 {
private Singleton2() {
}
private static class Inner {
private static final Singleton2 INSTANCE = new Singleton2();
}
public static Singleton2 getInstance() {
return Inner.INSTANCE;
}
}
方法二:单例模式(线程不安全)(不推荐)
/**
* @author 邓林妹
* @date 2022/5/16
*/
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (null == singleton) {
singleton = new Singleton();
}
return singleton;
}
}
使用方法二时,没用 final 修饰,因为使用 final 修饰后,就必须要 new 一个空的 Singleton 对象。我们这个 Singleton 是需要为空时,才创建,不需要一个空的对象。