说完单例模式基础之后,现在来说说加强版(回顾基础版)
既然懒汉式和饿汉式都有优缺点,那能不能综合一下呢?
双重锁:既然懒汉式有线程安全问题,即两个女生同时和一个男生结婚,他们都满足“男生之前没有领过证”的条件,怎么样避免呢?很简单,你们两个不要同时一起,一个一个按顺序来即可,代码如下:
/**
* 双重锁,懒汉式加强,保证一夫一妻。
*/
public class Husband03 {
//这句话看起来很奇怪,就理解为一开始每个男人都是没有老婆的
private static Husband03 wife = null;
//私有化老公,让小三无法拥有
private Husband03(){}
//当家里人找你要老婆的时候
public static Husband03 getWife(){
if(wife == null){//两个女生同时来和一个男生领结婚证。
synchronized (Husband03.class) {//法官:等一下,你们一个一个来。
if(wife == null){//检查男生是否已经领证。
wife = new Husband03();
}
}
}
return wife;
}
}
内部类:加synchronized会很影响效率(下一讲具体解说),那么如何让男生既在结婚前只用花一个人的钱,又能让男生不找小三呢?月老!提前把男生和女生绑在一起,告诉男生你已经有老婆了,等你需要的时候来找我要(线程安全),而且在男生不想找老婆之前不用知道到底是谁,只用花一个人的钱!(节约资源)
java代码如下:
/**
* 内部类
*/
public class Husband04 {
//月老:男生女生已经牵了红绳,随时来取。
private static class WifeClass{
private static final Husband04 wife = new Husband04();
}
//私有老公,让小三无法拥有
private Husband04(){}
//当家里人找你要老婆的时候,直接找月老要红绳的名单就可以了。
public static Husband04 getInstance(){
return WifeClass.wife;
}
}
枚举类:枚举式本身就是一种单例模式(官方提供,非常安全,可理解为饿汉式的强化版)
public enum Husband05 {
WIFE;
}
这三种方法都在不同程度上综合懒汉式、饿汉式的优点,至于5种方法的效率,安全性以及什么情况下使用哪种方式,请看5种单例模式的安全性问题 与 5种单例模式的效率问题。