两种特殊的单例模式

2018-04-06  本文已影响17人  西5d

单例模式特性是只初始化一次,同时考虑满足懒加载的需要,以及满足多线程访问的安全性。在实际的生产使用中,比如像数据库连接,或者其他比较耗时同时需要只初始化一次的实例,都应该采用单例模式来创建。以下是两种比较特殊的单例模式,分别通过静态内部类和枚举来实现,满足只初始化一次,懒加载,多线程安全访问三个特性。其中多线程安全不额外加锁。

//枚举
public enum SingletonEnum {
    INSTANCE;
    private Map map = null;//other like db connections and so on,使用map来模拟

    SingletonEnum() {
        map = new HashMap<>();
    }

    public Map getInstance() {
        return map;
    }

    public static void main(String[] args) {
        Map m1 = SingletonEnum.INSTANCE.getInstance();
        Map m2 = SingletonEnum.INSTANCE.getInstance();

        System.out.println(m1 == m2);
    }
}
//静态内部类
public class Singleton {
    private String name;

    private Singleton() {
        name = "singleton";
    }

    public static Singleton getInstance() {
        return Holder.inst;
    }

    public String getName() {
        return name;
    }

    private static class Holder {
        private static final Singleton inst = new Singleton();
    }

    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读