单例模式解析

1.什么是单例模式

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

2.单例模式存在原因

(1)确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例 。

(2)用于控制资源访问、管理共享资源(如配置文件、数据库连接等)或实现一个全局服务等多种场景。

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

(1)私有构造方法

防止外部通过new关键字创建类的实例。
(2)私有静态实例

在类内部创建一个类的唯一实例,并将其声明为静态变量。
(3)公共静态方法

提供一个公共的静态方法,返回类的唯一实例,并在需要时创建这个实例。

4.具体方案:

懒汉式(线程不安全)

java 复制代码
public class Singleton {  
    private static Singleton instance;  
  
    private Singleton() {}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

懒汉式(线程安全)

java 复制代码
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)

java 复制代码
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;  
    }  
}

静态内部类

java 复制代码
public class Singleton {  
    private Singleton() {}  
  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}

枚举

java 复制代码
public enum Singleton {  
    INSTANCE;  
  
    public void whateverMethod() {  
    }  
}
相关推荐
jimy13 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
captain3763 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫123 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心中有你02144 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
心疼你的一切4 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
步行cgn4 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ5 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog5 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老5 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
tongyiixiaohuang5 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库