当前位置:网站首页>单例模式

单例模式

2022-08-09 06:22:00 考拉盖饭

单例模式

单例模式分饿汉式和懒汉式

饿汉式:

​ 在类加载时就完成了初始化,所以类加载比较慢,不过这个慢也是看实例对象的大小,一般的单例都不会存放大容量的内容,所以大部分在毫秒级别,但获取对象的速度快。

public class Hungry {
    
    private Hungry(){
    
        // 私有化构造器
    }
    private static Hungry HUNGRY = new Hungry(); // 饿汉式

    // 对外提供获取对象的方法
    public static Hungry getInstance() {
    
        return HUNGRY;
    }
}

懒汉式:

​ 在类加载时不初始化,等到第一次被使用时才初始化,所以会有并发的可能存在。

1.双重检查懒汉式

public class Lazy {
    
    private Lazy(){
    
        // 私有化构造器
    }
    private volatile static Lazy lazy;
	
    // 双重检查懒汉式,当然,这种方式可以被反射破坏,不过正常使用这一种就可以
    public static Lazy getInstance() {
    
        if (lazy==null){
    
            synchronized (Lazy.class){
    
                if(lazy==null){
    
                    lazy = new Lazy();
                }
            }
        }
        return lazy;
    }

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
    
        Lazy instance = Lazy.getInstance();
        Constructor<Lazy> declaredConstructor = Lazy.class.getDeclaredConstructor(new Class[]{
    });
        declaredConstructor.setAccessible(true);
        Lazy lazy = declaredConstructor.newInstance();
        System.out.println(instance);
        System.out.println(lazy);
        /*for (int i = 1; i <= 10; i++) { new Thread(()->{ Lazy.getInstance(); },String.valueOf(i)).start(); }*/
    }
}

2.枚举懒汉式

// 因为枚举本身自动支持序列化机制,绝对防止多次实例化
public enum EnumSingle {
    
    SINGLE;

    public static EnumSingle getInstance(){
    
        return SINGLE;
    }
}
// 试图通过反射来破坏枚举的单例也是不成功的
class Test{
    
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    
        EnumSingle instance = EnumSingle.getInstance();
        Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class);
        declaredConstructor.setAccessible(true);
        EnumSingle enumSingle = declaredConstructor.newInstance();
        System.out.println(instance);
        System.out.println(enumSingle);
    }
}
原网站

版权声明
本文为[考拉盖饭]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_45425667/article/details/115301486