Java实现创建模式-单例模式(饿汉式、懒汉式、双重检查锁、单例枚举)

Java实现创建模式-单例模式(饿汉式、懒汉式、双重检查锁、单例枚举)

内容说明

单例模式解决的问题是确保一个类只有一个实例,并提供全局访问点,以避免多个对象之间的冲突和资源浪费。这种模式通常用于管理共享资源,例如数据库连接池或线程池。
本文实现了四种不同类型的单例模式:饿汉式、懒汉式、双重检查锁和枚举
为了汇总测试,通过Main方法创建两个实例来检查它们是否是同一个对象

public class testSingleton {
    
    
    public static void main(String[] args) {
    
    
        Singleton1 s1 = Singleton1.getInstance();
        Singleton1 s2 = Singleton1.getInstance();
        System.out.println(s1 == s2); // true

        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        System.out.println(s3 == s4); // true

        Singleton3 s5 = Singleton3.getInstance();
        Singleton3 s6 = Singleton3.getInstance();
        System.out.println(s5 == s6); // true

        Singleton4 s7 = Singleton4.INSTANCE;
        Singleton4 s8 = Singleton4.INSTANCE;
        System.out.println(s7 == s8); // true
    }
}

// 饿汉式单例模式
class Singleton1 {
    
    
    private static Singleton1 instance = new Singleton1();
    private Singleton1() {
    
    }
    public static Singleton1 getInstance() {
    
    
        return instance;
    }
}

// 懒汉式单例模式
class Singleton2 {
    
    
    private static Singleton2 instance;
    private Singleton2() {
    
    }
    public static synchronized Singleton2 getInstance() {
    
    
        if (instance == null) {
    
    
            instance = new Singleton2();
        }
        return instance;
    }
}

// 双重检查锁单例模式
class Singleton3 {
    
    
    private volatile static Singleton3 instance;
    private Singleton3() {
    
    }
    public static Singleton3 getInstance() {
    
    
        if (instance == null) {
    
    
            synchronized (Singleton3.class) {
    
    
                if (instance == null) {
    
    
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

// 枚举单例模式
enum Singleton4 {
    
    
    INSTANCE;
}

饿汉模式

饿汉式初始化在类加载时创建单例类的实例。这确保了实例始终可用且线程安全,但如果实例不总是需要,则可能会浪费资源。

// 饿汉式单例模式
class Singleton1 {
    
    
    private static Singleton1 instance = new Singleton1();
    private Singleton1() {
    
    }
    public static Singleton1 getInstance() {
    
    
        return instance;
    }
}

懒汉模式

懒汉式初始化仅在需要时创建单例类的实例。这样可以节省资源,但如果没有同步,则不是线程安全的。

// 懒汉式单例模式
class Singleton2 {
    
    
    private static Singleton2 instance;
    private Singleton2() {
    
    }
    public static synchronized Singleton2 getInstance() {
    
    
        if (instance == null) {
    
    
            instance = new Singleton2();
        }
        return instance;
    }
}

双重检查锁

双重检查锁是懒汉式初始化的线程安全版本,它避免了在创建实例后的第一次同步。

// 双重检查锁单例模式
class Singleton3 {
    
    
    private volatile static Singleton3 instance;
    private Singleton3() {
    
    }
    public static Singleton3 getInstance() {
    
    
        if (instance == null) {
    
    
            synchronized (Singleton3.class) {
    
    
                if (instance == null) {
    
    
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

枚举单例

枚举单例模式是一种简单的线程安全单例模式

// 枚举单例模式
enum Singleton4 {
    
    
    INSTANCE;
}

猜你喜欢

转载自blog.csdn.net/u010349629/article/details/129717447