单例模式
来源:[尚硅谷JavaEE面试题-哔哩哔哩]
一、饿汉式
直接实例化对象
- 类加载与初始化时直接 new 对象
枚举
- 类加载与初始化时直接产生对象
静态代码块饿汉式
-
static 代码块最终会和其他初始化语句,一起合成
<clinit>
方法一起初始化。-
<clinit>
方法的执行时期: 类初始化阶段(该方法只能被 jvm 调用,专门承担类变量的初始化工作)。 -
<clinit>
方法的内容: 所有的类变量初始化语句和类型的静态初始化器。
-
二、 懒汉式
线程不安全(单线程)
线程安全
- 指令重排的话,也会线程安全么???
静态内部类形式
//懒惰式-静态代码块可以保证线程安全
// 只有当内部类被加载时,才会创建对象
// 静态内部类不会自动随着外部类的加载和初始化而初始化。它是单独去加载和初始化的。
/**
1)class Singleton 而不需要 public static 修饰
2)静态内部类的静态成员 SINGLETON 声明为 final
*/
class Singleton{
private Singleton(){}
//静态内部类
private static class LazyHolder(){
private static final Singleton SINGLETON = new Singleton();
}
public static Singleton getInstance(){
return LazyHolder.SINGLETON;
}
}