饿汉模式基于jvm类加载的机制来保证一个单例模式 类加载的初始化阶段就完成了实例的初始化。本质上就是借助于jvm类加载机制,保证实例的唯一性。 类加载机制: 1、.java文件编译成.class文件 2、验证:验证字节码文件的格式,如:开头为cafe babe 3、准备:将代码里的静态变量赋默认值,final常量直接赋值,没有赋默认值,如:Integer 赋值 0 boolearn 赋值 false, 4、解析:将符号引用转换成直接引用。直接引用:方法在jvm内存中的地址 5、初始化:将赋予默认值的静态变量赋最终值 只有在真正使用对应的类时,才会触发初始化如(当前类是启动类即main函数所在类,直接进行new操作,访问静态属性、访问静态方法,用反射访问类,初始化一个类的子类等.)
饿汉模式可以通过反射的方式来创建对象进行一个破坏!!!
public class HungrysingltetonTest { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //通过反射来破坏 Constructor<Hungrysinglteton> declaredConstructor = Hungrysinglteton.class.getDeclaredConstructor(); declaredConstructor.setAccessible(true); Hungrysinglteton hungrysinglteton = declaredConstructor.newInstance(); Hungrysinglteton hungrysinglteton1 = Hungrysinglteton.getHungrysinglteton(); System.out.println(hungrysinglteton==hungrysinglteton1); } } class Hungrysinglteton{ private static Hungrysinglteton hungrysinglteton = new Hungrysinglteton(); private Hungrysinglteton(){ //判断hungrysinglteton是否为空来防止反射创建多例 饿汉和静态内部类可以用这个方式防止反射,但是懒汉不行 if(hungrysinglteton != null){ throw new RuntimeException( "单例不允许多个实例..." ); } } public static Hungrysinglteton getHungrysinglteton() { return hungrysinglteton; } }