单例模式解析

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() {  
    }  
}
相关推荐
Ulyanov3 分钟前
《玩转QT Designer Studio:从设计到实战》 QT Designer Studio入门实战:智能登录系统开发
开发语言·python·qt·雷达电子对抗
SeeD NICK3 分钟前
Spring Boot 3.4 正式发布,结构化日志!
java·spring boot·后端
人道领域4 分钟前
深度揭秘:JDK 21 虚拟线程原理与性能调优实战
java·开发语言·python·jdk
2501_948114246 分钟前
大模型API调用成本优化的工程路径:星链4SAPI聚合网关的技术实践
大数据·开发语言·人工智能·架构·php
oLLI PILO7 分钟前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
de_wizard10 分钟前
Spring Boot 整合 Apollo 配置中心实战
java·spring boot·后端
JAVA学习通10 分钟前
AI Agent 工具调用机制深度解析与 Spring Boot 工程集成实战(2026版)
java·人工智能·spring boot·python·spring
ooseabiscuit11 分钟前
Spring报错解决一览
java·后端·spring
Foreer黑爷13 分钟前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
南宫萧幕13 分钟前
从YALMIP工具箱到车辆工况仿真:MATLAB控制策略开发的完整实践指南
开发语言·人工智能·matlab·simulink