单例模式解析

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() {  
    }  
}
相关推荐
计算机毕设VX:Fegn08956 分钟前
计算机毕业设计|基于springboot + vue个人博客系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
2501_9466756416 分钟前
Flutter与OpenHarmony打卡轮播图组件
java·javascript·flutter
ray96322 分钟前
Python——函数参数传递方式
开发语言·python
独自破碎E24 分钟前
Spring Boot 3.x和2.x版本相比有哪些区别与改进?
java·spring boot·后端
BullSmall24 分钟前
Socket中断原因与处理全攻略
开发语言
十五年专注C++开发24 分钟前
浅谈Qt中的QSql模块整体设计
开发语言·数据库·c++·qt
梅羽落28 分钟前
python武器化开发_01
开发语言·python·php
Joe_Blue_0232 分钟前
Matlab 入门案例介绍——如何创建脚本
开发语言·matlab·matlab 入门案例
坚持学习前端日记33 分钟前
个人运营小网站的最佳策略
java·学习·程序人生·职场和发展·创业创新
幽络源小助理38 分钟前
SpringBoot+Vue美食网站系统源码 | Java餐饮项目免费下载 – 幽络源
java·vue.js·spring boot