单例模式解析

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() {  
    }  
}
相关推荐
离陌在学C#14 分钟前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山29 分钟前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
二十雨辰38 分钟前
[Java]-Spring面试题
java·开发语言
老马历写记1 小时前
Maven POM 依赖管理总结
java·maven·system·pom·optional
古法安卓1 小时前
Android-车机 GNSS 定位数据接收问题排查
android·java·android studio
蔬菜_1 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
萧瑟余晖1 小时前
Java深入解析篇二十二之虚拟线程
java·开发语言
OuO-21 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵
油丶酸萝卜别吃2 小时前
Java 集合类全景介绍
java·开发语言
钱栈up2 小时前
"Flowable 工作流引擎进阶实战(高级篇):任务分配、流程变量与监听器"
java