单例模式(Java实现)

1. 懒汉式线程不安全

java 复制代码
public class LazyUnsafeSingleton {
    private static LazyUnsafeSingleton singleton;

    private LazyUnsafeSingleton(){}

    public static LazyUnsafeSingleton getInstance() {
        if (singleton == null) singleton = new LazyUnsafeSingleton();
        return singleton;
    }
}

2. 饿汉式(线程安全)

java 复制代码
public class HungrySingleton {
    private static HungrySingleton singleton = new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance() {
        return singleton;
    }
}

3. 懒汉式线程安全

volatile
synchronized

java 复制代码
public class LazySafeSingleton {
    private static volatile LazySafeSingleton singleton;

    private LazySafeSingleton(){}

    public static synchronized LazySafeSingleton getInstance() {
        if (singleton == null) singleton = new LazySafeSingleton();
        return singleton;
    }
}

4. 双重检查锁

java 复制代码
public class DoubleCheckedLockSingleton {
    private static volatile DoubleCheckedLockSingleton singleton;

    private DoubleCheckedLockSingleton(){}

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

5. 静态内部类

java 复制代码
public class StaticInnerClassSingleton {
    private static StaticInnerClassSingleton singleton;

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

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

6. 枚举类型

java 复制代码
public enum EnumSingleton {
    SINGLETON;

    public String doSomeThing() {
        return "hello world";
    }
}

测试类

java 复制代码
public class SingletonTest {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, InterruptedException {
        // 1. 懒汉式线程非安全
        LazyUnsafeSingleton lazyUnsafeSingleton = LazyUnsafeSingleton.getInstance();

        // 2. 饿汉式
        HungrySingleton hungrySingleton = HungrySingleton.getInstance();

        // 3. 懒汉式线程安全
        LazySafeSingleton lazySafeSingleton = LazySafeSingleton.getInstance();

        // 4. 双重检查锁
        DoubleCheckedLockSingleton doubleCheckedLockSingleton = DoubleCheckedLockSingleton.getInstance();

        // 5. 静态内部类
        StaticInnerClassSingleton staticInnerClassSingleton = StaticInnerClassSingleton.getInstance();

        // 6. 枚举类型
        EnumSingleton enumSingleton = EnumSingleton.SINGLETON;
        enumSingleton.doSomeThing();

        // 反射无法破坏枚举类型的单例模式
        Class<EnumSingleton> enumSingletonClass = EnumSingleton.class;
//        Constructor<EnumSingleton> declaredConstructor = enumSingletonClass.getDeclaredConstructor();
        Constructor<?> declaredConstructor = enumSingletonClass.getDeclaredConstructors()[0];
        declaredConstructor.setAccessible(true);
        Object enumSingleton1 = declaredConstructor.newInstance(); // java.lang.IllegalArgumentException


        // 7. 反射破坏非枚举类型的单例模式
        // (1)获取 Singleton 类的 Class 对象
        Class<LazyUnsafeSingleton> lazyUnsafeSingletonClass = LazyUnsafeSingleton.class;

        // (2)获取 Singleton 类的私有构造函数
        Constructor<LazyUnsafeSingleton> constructor = lazyUnsafeSingletonClass.getDeclaredConstructor();

        // (3)设置私有构造函数的可访问性
        constructor.setAccessible(true);

        // (4)使用私有构造函数创建新的实例
        LazyUnsafeSingleton lazyUnsafeSingletonFromReflect = constructor.newInstance();

        // 打印新创建的实例和原始实例是否相等
        System.out.println("Original Instance: " + LazyUnsafeSingleton.getInstance());
        System.out.println("New Instance: " + lazyUnsafeSingletonFromReflect);
        System.out.println("Are instances equal? " + (LazyUnsafeSingleton.getInstance() == lazyUnsafeSingletonFromReflect));
    }
}
相关推荐
谁似人间西林客2 天前
工业大数据实战:看中国智造如何用数据驱动效率革命
大数据·单例模式
张小姐的猫2 天前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
Java面试题总结3 天前
双重检验锁的单例模式在高并发下的可见性问题
单例模式
珊瑚里的鱼5 天前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
韩曙亮6 天前
【Flutter】Dart 单例 ( 单例模式核心规则 | 饿汉式单例 | 懒汉式单例 | 极简空安全 懒汉式单例 | 工厂构造函数单例 )
flutter·单例模式·dart·饿汉式单例·懒汉式单例·空安全·空赋值
就叫_这个吧8 天前
理解Java反射机制和内省机制应用与实践
java·开发语言·反射
wunaiqiezixin8 天前
如何在C++中实现一个单例模式?
c++·单例模式
basketball6168 天前
设计模式入门:1. 单例模式详解 C++实现
c++·单例模式·设计模式
bugcome_com8 天前
阿里云OSS工具类完整设计与实现:基于.NET的静态单例模式实践
阿里云·单例模式·.net·oss
JAVA9658 天前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试