说完单例模式基础之后,现在来说说加强版(回顾基础版)
既然懒汉式和饿汉式都有优缺点,那能不能综合一下呢?
双重锁:既然懒汉式有线程安全问题,即两个女生同时和一个男生结婚,他们都满足“男生之前没有领过证”的条件,怎么样避免呢?很简单,你们两个不要同时一起,一个一个按顺序来即可,代码如下:
/** * 双重锁,懒汉式加强,保证一夫一妻。 */ 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种单例模式的效率问题。