• 单例模式详解【2023年最新】


    一、单例模式概念

    单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。它的目的是限制一个类只能创建一个对象,以确保在整个应用程序中只有一个共享的实例。

    单例模式通常用于以下情况:

    1. 当一个类只需要一个实例来协调操作时,例如数据库连接池、线程池等。
    2. 当希望在整个应用程序中共享某个资源或状态时,例如配置信息、日志记录器等。
    3. 当创建一个对象的成本很高,但又需要频繁地使用该对象时,可以通过单例模式来避免重复创建对象,提高性能。

    单例模式的关键特点包括:

    1. 私有的构造方法:通过将构造方法私有化,防止外部代码直接实例化该类。
    2. 静态变量持有实例:通过一个静态变量来持有类的唯一实例。
    3. 全局访问点:提供一个公共的静态方法来获取该实例,以便其他代码可以访问该实例。

    常见的单例模式实现方式包括饿汉式、懒汉式、双重检查锁定等。每种实现方式都有其优缺点,选择适合具体需求的实现方式非常重要

    二、单例模式类型

    1、懒汉式

    这里使用了volatile,防止指令重排序。

    另外,使用synchronized修饰代码,加锁变成线程安全。

    1. public class SingleTon {
    2. // 懒汉式
    3. private static volatile SingleTon singleTon;
    4. private SingleTon(){
    5. }
    6. public static SingleTon getInstance(){
    7. if(singleTon==null){
    8. synchronized (SingleTon.class){
    9. if(singleTon==null){
    10. return new SingleTon();
    11. }
    12. }
    13. }
    14. return singleTon;
    15. }
    16. }

    2、饿汉式

    这里的饿汉式没什么好说的。

    1. public class SingleTon1 {
    2. // 饿汉式
    3. private static final SingleTon1 singleTon1 = new SingleTon1();
    4. private SingleTon1(){
    5. }
    6. public static SingleTon1 getInstance(){
    7. return singleTon1;
    8. }
    9. }

    3、枚举(饿汉式升级版)

    前面两种懒汉式和饿汉式都可以被反射或者序列化破坏,他们俩可以把单例对象破坏掉(即产生多个对象)而使用枚举就可以避免这种情况,而且使用枚举在代码简洁的情况下,还不用做任何操作即可保证创建对象的单一性和线程的安全性。

    1. public enum EnumSingleTon {
    2. INSTANCE;
    3. EnumSingleTon(){
    4. System.out.println("枚举创建对象了");
    5. }
    6. public void doSomeThing(){
    7. System.out.println("这是枚举的单例模式");
    8. }
    9. public static void main(String[] args) {
    10. test();
    11. }
    12. public static void test(){
    13. EnumSingleTon enumSingleTon1 = EnumSingleTon.INSTANCE;
    14. EnumSingleTon enumSingleTon2 = EnumSingleTon.INSTANCE;
    15. System.out.print("enumSingleTon1和enumSingleTon2的地址是否相同:");
    16. System.out.println(enumSingleTon1==enumSingleTon2);
    17. }
    18. }

    运行结果

    学生所做,仅记录学习。

  • 相关阅读:
    mongo集群同步数据异常,手动同步节点副本数据
    使用set_handler过滤掉特定的SystemC Wraning &Error Message
    Redis支撑秒杀场景的关键技术和实践都有哪些?
    直接插入排序、希尔排序详解。及性能比较
    Day41信息收集
    源码分享-HTML文档解析---GoLang实现
    system V共享内存【Linux】
    原生php单元测试示例
    【微信小程序】获取用户手机号的实现
    5 分钟教你搭建「视频动作分类」系统
  • 原文地址:https://blog.csdn.net/qq_60387902/article/details/134043206