单例模式

来源:[尚硅谷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;
	}

}
原文地址:https://www.cnblogs.com/miaomiaowu/p/14965752.html