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

单例模式的五种实现方式

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

相关文章:

  • 基于BMO磁性细菌优化的WSN网络最优节点部署算法matlab仿真
  • 获取当前页面的 url 参数
  • Ubuntu20.04本地配置IsaacLab 4.5.0的训练环境(一)
  • 安卓基础组件Looper - 02 native层面的剖析
  • 单线程 Redis 如何实现高可用?深入图解主从复制与哨兵模式
  • HuggingFace 模型转换为 GGUF/GGML
  • [MySQL初阶]MySQL(4)基本查询
  • K8s 1.27.1 实战系列(一)介绍及准备工作
  • 使用阿里云 API 进行声音身份识别的方案
  • Pycharm 远程执行无法显示 cv2.imshow() 的原因分析及解决方案
  • wheel_legged_genesis 开源项目复现与问题记录
  • Linux - 进程控制
  • 【极光 Orbit•STC8A-8H】02. STC8 单片机工程模板创建
  • 鸿蒙全栈开发 D1
  • JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测
  • git-filter-repo 清除大文件教程
  • K8S学习之基础十:k8s中初始化容器和主容器
  • 游戏辅助技术教程【预习课】
  • FPGA-按键消抖
  • 信息安全技术、加密、摘要、签名、PKI(高软41)
  • 张巍任中共河南省委副书记
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • 普京调整俄陆军高层人事任命
  • 阿里上季度营收增7%:淘天营收创新高,AI产品营收连续七个季度三位数增长
  • 澳大利亚首例“漂绿”诉讼开庭:能源巨头因“碳中和”承诺遭起诉
  • 第一集|好饭不怕晚,折腰若如初见