五种单例设计模式(Java实现)

懒汉式

public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
    }

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

线程不安全

饿汉式

public class HungrySingleton {
    private static HungrySingleton instance = new HungrySingleton();

    private HungrySingleton() {
    }

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

线程安全
不能实现懒加载,浪费资源

DCL双重检查

public class DCLSingleton {

    private static volatile DCLSingleton instance = null;

    private DCLSingleton() {
    }

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

线程安全
懒加载
volatile是为了防止代码重排(指令重排)

Holder懒加载

public class HolderSingleton {
    private HolderSingleton() {
    }

    private static class In {
        private static HolderSingleton instance = new HolderSingleton();
    }

    public static HolderSingleton getInstance() {
        return In.instance;
    }

}

线程安全
懒加载
内部类调用时才会初始化

枚举模式

public class EnumSingleton {

    private EnumSingleton() {
    }

    private enum In {
        INSTANCE;

        private EnumSingleton instance;

        In() {
            instance = new EnumSingleton();
        }

    }

    public static EnumSingleton getInstance() {
        return In.INSTANCE.instance;
    }
}

线程安全
懒加载
枚举的常量是枚举的单例对象.
内部类调用时才会初始化

发布了37 篇原创文章 · 获赞 1 · 访问量 1064

猜你喜欢

转载自blog.csdn.net/zhuchencn/article/details/102672783