目录

单例模式的五种实现方式

单例模式的五种实现方式

1、饿汉式

①实现: 在类加载的时候就初始化实例

②优点: 线程安全

③缺点: 实例在类加载的时候创建,可能会浪费资源

//饿汉式
public class EagerSingleton{
    
    private EagerSingleton(){}   //私有构造方法
    
    private static EagerSingleton instance = new EagerSingleton();

    public static EagerSingleton getInstance(){
        return instance;
    }
    
}

2、懒汉式

①实现: 在首次获取实例的时候再创建实例

②优点: 延迟加载,节省资源

③缺点: 线程不安全

public class LazySingleton{

    private LazySingleton(){}    //  私有构造方法

    private static LazySingleton instance;

    public static LazySingleton getInstance(){
        if(instance != null){
            instance = new LazySingleton();
        }
        return instance;
    }

}

3、双重检查锁

①实现: 通过双重检查+加锁+volatile方式实现

②优点: 线程安全

③缺点: 稍微复杂

public class DoubleCheckedSingleton{

    private DoubleCheckedSingleton(){}

    private static volatile DoubleCheckedSingleton instance;

    public static DoubleCheckedSingleton getInstance(){
        if(instance != null){
            sychronized (DoubleCheckedSingleton.class){
                if(instance != null){
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
 }

4、静态内部类

①实现: 静态内部类创建示例

②优点: 线程安全

③缺点: 无法通过参数构造实例

public class InnerClassSingleton{
    
    private InnerClassSingleton(){}

    private static class SingletonHolder{
        private static final InnerClassSingleton instance = new InnerClassSingleton();
    }
    
    public static InnerClassSingleton getInstance(){
        return SingletonHolder.instance;
    }
}

5、枚举

①实现: 通过枚举类型天然的单例特性实现

②优点: 线程安全、代码简洁、防止反射和序列化破坏单例

③缺点: 属于饿汉式,会浪费资源

public emun EnumSingleton{
    INSTANCE;
}

Runtime类就是通过饿汉式的方式实现的单例模式

https://i-blog.csdnimg.cn/direct/93b233e24279430b90349d42807798b4.png