单例模式的几种实现方式

在Java中,实现单例模式主要有几种方式:懒汉式、饿汉式、双重检查锁定、静态内部类和枚举。每种方式都有其特点和适用场景。

1. 饿汉式(线程安全)

饿汉式是最简单的一种实现方式,通过静态初始化实例,保证了线程安全。但它不是懒加载模式,无法在实际使用时才创建实例。

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

    private Singleton() {}

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

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

懒汉式实现了懒加载,但在多线程情况下不能保证单例的唯一性。

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

    private Singleton() {}

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

3. 懒汉式(线程安全)

通过同步方法保证线程安全,但每次访问时都需要同步,会影响性能。

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

    private Singleton() {}

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

4. 双重检查锁定(DCL)

双重检查锁定既保证了线程安全,又避免了每次访问时的性能损失。

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

5. 静态内部类

使用静态内部类的方式实现懒加载,且由JVM保证线程安全。

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

    private Singleton() {}

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

6. 枚举

使用枚举的方式是实现单例的最佳方法,不仅能避免多线程同步问题,还能防止反序列化重新创建新的对象。

java 复制代码
// 实现枚举单例
public enum Singleton {
    INSTANCE; // 唯一的枚举实例

    // 枚举类中可以包含成员变量、方法等
    private int value;

    // 可以定义自己需要的操作,如设置、获取枚举实例的状态等
    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    // 还可以定义其他方法
    public void show() {
        System.out.println("This is an enum singleton method.");
    }
}

// 使用枚举单例
public class TestSingleton {
    public static void main(String[] args) {
        Singleton singleton = Singleton.INSTANCE;

        singleton.setValue(1);
        System.out.println(singleton.getValue());

        singleton.show();
    }
}
相关推荐
繁华似锦respect1 小时前
C++ 设计模式之工厂模式详细介绍
java·linux·c++·网络协议·设计模式
想要成为祖国的花朵1 小时前
基于多设计模式的抽奖系统__测试报告
java·selenium·测试工具·jmeter·设计模式·测试用例·安全性测试
重铸码农荣光3 小时前
JavaScript 面向对象编程:从字面量到原型继承的深度探索
前端·javascript·设计模式
L***d6705 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
未可知7776 小时前
软件设计师(下午题2)、UML与设计模式
算法·设计模式·职场和发展·uml
繁华似锦respect6 小时前
C++ 设计模式之单例模式详细介绍
服务器·开发语言·c++·windows·visualstudio·单例模式·设计模式
xunyan62346 小时前
面向对象(下)-设计模式与单例设计模式
java·单例模式·设计模式
隔山打牛牛6 小时前
单例模式:高效实现全局唯一实例
单例模式
ZHE|张恒14 小时前
设计模式(十四)模板方法模式 — 定义流程骨架,把步骤差异留给子类
设计模式·模板方法模式
Codebee14 小时前
深度解析AI编程技术:从原理到实践,手把手教你落地
人工智能·设计模式·开源