【趣解】单例模式之双重锁、内部类、枚举

说完单例模式基础之后,现在来说说加强版(回顾基础版

既然懒汉式和饿汉式都有优缺点,那能不能综合一下呢?

双重锁:既然懒汉式有线程安全问题,即两个女生同时和一个男生结婚,他们都满足“男生之前没有领过证”的条件,怎么样避免呢?很简单,你们两个不要同时一起,一个一个按顺序来即可,代码如下:

/**
 * 双重锁,懒汉式加强,保证一夫一妻。
 */
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种单例模式的效率问题



猜你喜欢

转载自blog.csdn.net/a445849497/article/details/57514565
今日推荐