单例设计模式多种实现方式

饿汉式

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {} //私有化构造函数,防止new对象
    public static Singleton getInstance() {
        return intance;
    }
}

懒汉式

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instace == null) {
            intance = new Singleton();
        }
        return intance;
    }
}

Double Check Lock模式

这种模式为了线程安全需要双重检查,第二层检查的目的是防止一种情况出现:假设有A线程进到同步代码块里面,但还没执行完intance = new Singleton(); 此时intance为null,如果这时B线程获取单例会走到synchronize这里,因为同步的原因B线程会阻塞等待,当A线程执行完后intance已经指向一个Singleton对象了,这时B线程进入到同步代码块,如果不加第二个条件,B线程又会创建一个新对象,这就不符合单例的原则了。

public class Singleton {
    private static Singleton instance == null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instace == null) {
            synchronize(Singleton.class) {
                if (instace == null) {
                    intance = new Singleton();
                }
            }
        }
        return intance;
    }
}

静态内部类模式

推荐使用此方法实现单例。当第一次调用getInstance()方法时,虚拟化会加载SingletonHolder类,因为它是静态内部类可以保证内部对象的唯一,并且线程安全

public class Singleton {
    private Singleton() {}
    public static Singleton getInstance() {
        return SingletonHolder.intance;
    }
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();      
    }
}

使用容器实现单例

我们使用HashMap来存储需要的单例类型,在程序开始调用registerService来注册各种单例类型,当我们需要单例对象时使用getIntance()从HashMap中获取单例类型

public class SingleManager {
    private static Map<String, Object> singleMap = new HaspMap<>();
    private SingleManager(){}
    public static void registerService(String key, Object obj){
        if (!singleMap.containsKey(key))
            singleMap.put(key, obj);
    }
    public static object getIntance(String key) {
        return singleMap.get(key);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值