每日一题:单例的几种写法

49 阅读1分钟

1.饿汉

静态变量直接初始化
非懒加载、线程安全(类加载的锁)、效率高、JVM按需加载

public class MyClass {
    public static final MyClass instance = MyClass();
}

2.懒汉

synchronized修饰的静态方法中判空、初始化、返回
效率低(每次都获取释放锁)、线程安全(类元对象作为锁)、懒加载、一次判空

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

3.双重检验

volatile修饰的静态私有变量,静态方法中双重判空,首次判空后加锁,锁内再次判空,空则初始化
懒加载、线程安全(一般用类元对象作为锁)、效率高

public class MyClass {
    private volatile static MyClass instance;

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

4.静态内部类

静态内部类中的饿汉
懒加载、效率高、线程安全(类加载的锁)

public class MyClass {
    public static class InnerClass {
        public static MyClass instance = new MyClass();
    }
}

5.枚举

创建只有一个实例的枚举类,在这个枚举类定义方法实现功能 类加载时创建、非懒加载、线程安全(类加载的锁)、可避免反序列化和反射可能导致的破坏、代码简洁

public enum MyClass {
    INSTANCE;

    public void doYourWork() {
        
    }
}