单例模式

单例模式,就是Java进程中只存在一个类的实例。

1. 懒汉式(首次使用时创建,之后判断单例实例存不存在)

public class LazySingleton {
    private static Singleton instance;

    private Singleton() {}

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

2. 饿汉式(在类初始化的时候就会创建,线程安全)

private static final Singleton instance = new Singleton();

3. 双检锁 使用volatile,防止指令重排;加锁;

public class VolatileTest {
    public static volatile Singleton instance; // 确保线程可见性,防止指令重排,但是不能保证原子性

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (VolatileTest.class) { // 防止线程在等待锁的时候已经创建了实例
                if (instance == null) {
                    instance = new Singleton();
                    // 1. 为 instance 分配内存空间 2. 初始化 instance 3. 将 instance 指向分配的内存地址
                    // 如果不能防止指令重排 1. 为 instance 分配内存空间 3. 将 instance 指向分配的内存地址 2. 初始化 instance  多线程情况下会出现线程不安全
                }
            }
        }
        return instance;
    }
}

4. 静态内部类

  1. 内部类在使用时才会创建实例
public class Singleton { 
    private static class SingletonHolder { 
        private static final Singleton INSTANCE = new Singleton(); 
    } 
    private Singleton (){
    } 
    public static final Singleton getInstance() { 
        return SingletonHolder.INSTANCE; 
    } 
}

5. 枚举类

public enum Singleton { 
    INSTANCE; 
    public void whateverMethod() {
    }
}
posted @ 2023-01-03 17:40  帅气的涛啊  阅读(26)  评论(0)    收藏  举报