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

单例模式解析

1.什么是单例模式

一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。

2.单例模式存在原因

(1)确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例
(2)用于控制资源访问、管理共享资源(如配置文件、数据库连接等)或实现一个全局服务等多种场景。

3.如何实现一个单例模式

(1)私有构造方法
防止外部通过new关键字创建类的实例。
(2)私有静态实例
在类内部创建一个类的唯一实例,并将其声明为静态变量。
(3)公共静态方法
提供一个公共的静态方法,返回类的唯一实例,并在需要时创建这个实例。

4.具体方案:

懒汉式(线程不安全)

public class Singleton {  
    private static Singleton instance;  
  
    private Singleton() {}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

懒汉式(线程安全)

public class Singleton {  
    private static Singleton instance;  
  
    private Singleton() {}  
  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

双重检查锁定(Double-Checked Locking)

public class Singleton {  
    // volatile关键字确保多线程的可见性和禁止指令重排序  
    private static volatile Singleton instance;  
  
    private Singleton() {}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            synchronized (Singleton.class) {  
                if (instance == null) {  
                    instance = new Singleton();  
                }  
            }  
        }  
        return instance;  
    }  
}

静态内部类

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

枚举

public enum Singleton {  
    INSTANCE;  
  
    public void whateverMethod() {  
    }  
}

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

相关文章:

  • 接口防篡改+防重放攻击
  • AI刷题-小R的随机播放顺序、不同整数的计数问题
  • springboot多环境配置
  • PyTorch 神经协同过滤 (NCF) 推荐系统教程
  • 【Linux】13.Linux进程概念(2)
  • UDP报文格式
  • 基于高通主板的ARM架构服务器
  • 深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎
  • 面试常见题之java
  • 甘特图组件DHTMLX Gantt中文教程 - 如何实现持久UI状态
  • Redis的存储原理和数据模型
  • Linux EOF详解使用
  • vue3判断elementui中el-form是否更新变化,变化就提示是否保存,没变就直接离开
  • 语法课第七节 结构体 类 指针 引用(知识点+题目)
  • golang hertz框架入门
  • 数据结构 - 链表
  • 数据分析-19-时间序列预测之时间窗口数据的划分
  • 总结——薄基础_Android开发_简易计算器__非教程
  • Nestjs微服务简单案例
  • List<Map<String, Object>>汇总统计排序
  • paddle模型转onnx介绍(以utc-mini为例)
  • shell脚本编程-进阶部分
  • 作为负责招聘的HR,如何解决职位吸引力不足的问题
  • 【STM32】OLED
  • 部署后端WebSocket服务到AWS云服务器
  • C++与QML的数据交互