当前位置: 首页 > article >正文

单例模式的五种实现方式

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类就是通过饿汉式的方式实现的单例模式


http://www.kler.cn/a/574038.html

相关文章:

  • MATLAB中lookAheadBoundary函数用法
  • 【前端基础】Day 6 CSS定位
  • 护照阅读器在汽车客运站流程中的应用
  • 洛谷P1102 A-B 数对
  • OceanBase-obcp-v3考试资料梳理
  • qt作业day5
  • Spring Cloud Alibaba学习 5- Seata入门使用
  • UE4 组件 (对话组件)
  • 6. PromQL的metric name(在node exporter复制下来交给AI解释的)
  • SpringCloud系列教程(十三):Sentinel流量控制
  • 【Elasticsearch】Index Lifecycle Management
  • C语言基础2
  • 设计模式 + java8方法引用 实现任意表的过滤器
  • 多线程-CompletableFuture
  • AI推理革新:Dynasor-CoT如何提升复杂任务效率
  • 【AI学习从零至壹】Pytorch逻辑回归
  • FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
  • 模块15.常用API
  • QT.....................................5
  • Redis 脚本:高效数据管理的利器