每日一题:单例模式

每日一题:单例模式

单例模式是确保一个类只有一个实例,并提供一个全局访问点

1.饿汉式(静态常量)

  • 特点:在类加载时就创建了实例。

  • 优点:简单易懂,线程安全。

  • 缺点:无论是否使用,都会加载实例。

go 复制代码
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 懒汉式(线程不安全)

  • 特点:在第一次调用 getInstance() 方法时创建实例。

  • 优点:按需创建实例。

  • 缺点:线程不安全。

go 复制代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

备注:线程安全可以直接使用synchronized加在方法上。

3. 懒汉式(双重检查锁定)

  • 特点:在第一次调用 getInstance() 方法时创建实例,使用双重检查锁定保证线程安全。

  • 优点:按需创建实例,线程安全。

  • 缺点:稍微复杂一些。

go 复制代码
public class Singleton {
    private volatile static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

4. 静态内部类

  • 特点:利用 Java 的类加载机制保证单例的唯一性。

  • 优点:懒加载,线程安全。

  • 缺点:稍微复杂一些

go 复制代码
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5. 枚举

  • 特点:利用枚举类型的特性实现单例。

  • 优点:简洁,线程安全。

  • 缺点:不太常用。

go 复制代码
public enum Singleton {
    INSTANCE;

    public void Method() {
        //实现方法
        System.out.println("实现方法")
    }
}

总结

单例模式确保一个类就只有一个实例,提供一个全局的访问点。确保一个类只有一个实例:类构造器私有化 ,避免其他地方可以new对象。提供一个全局的访问点:静态化私有变量,以及提供一个静态方法返回实例。 需要考虑线程是否安全,以及为了避免浪费资源,线程安全问题,考虑互斥性,原子性,可见性

往期推荐

<>

每日一题:青蛙跳台阶问题
<>

<>

Mysql优化相关学习(1)
<>

<>

Mysql8.0安装以及递归表达式使用
<>

<>

一文带你springai+ollama实现chat
<>

<>

大型语言模型(Large Language Model, LLM)了解一下?
<>

相关推荐
Evan芙1 分钟前
Tomcat内存机制以及按场景调优
java·tomcat
liwulin050615 分钟前
【PYTHON-YOLOV8N】关于YOLO的推理训练图片的尺寸
开发语言·python·yolo
总爱写点小BUG31 分钟前
打印不同的三角形(C语言)
java·c语言·算法
lsx20240637 分钟前
C语言中的强制类型转换
开发语言
coderHing[专注前端]40 分钟前
告别 try/catch 地狱:用三元组重新定义 JavaScript 错误处理
开发语言·前端·javascript·react.js·前端框架·ecmascript
星辰烈龙1 小时前
黑马程序员Java基础9
java·开发语言
山沐与山1 小时前
【Redis】Redis集群模式架构详解
java·redis·架构
ss2731 小时前
Java并发编程:DelayQueue延迟订单系统
java·python·算法
wcy_10111 小时前
七大软件设计原则
java·设计规范
invicinble1 小时前
jar包在执行的时候需要关注的细节(提供一个解构jvm问题的视角)
java·jvm·jar