单例模式的几种写法

1.懒汉式

public class SingleInstance1 {

	private SingleInstance1() {
		
	}
	private static SingleInstance1 instance;
	
	public static SingleInstance1 getInstance() {
		if(null == instance) {
			instance = new SingleInstance1();
		}
		return instance;
	}
}

 该程序缺点是线程不安全

 

public class SingleInstance1 {

	private SingleInstance1() {
		
	}
	private static SingleInstance1 instance;
	
	public synchronized static SingleInstance1 getInstance() {
		if(null == instance) {
			instance = new SingleInstance1();
		}
		return instance;
	}
}

以上程序线程安全,但效率太低 

 

2.饿汉式

 

public class SingleInstance2 {

	private SingleInstance2() {
		
	}
	private static SingleInstance2 instance = new SingleInstance2();
	
	public static SingleInstance2 getInstance() {
		return instance;
	}
}

 

改程序避免了每次调用getInstance方法时产生的同步开销

 

3.延长初始化占位类模式

public class SingleInstance3 {

	private SingleInstance3() {
		
	}
	
	private static class SingleInstance3Holder {
		public static SingleInstance3 instance = new SingleInstance3();
	}
	
	public static SingleInstance3 getInstance() {
		return SingleInstance3Holder.instance;
	}
}

只有当真正使用SingleInstance3Holder 类是才会初始化,并且由于是静态初始化,所以不需要同步

 

4.DCL

public class SingleInstance4 {

	private SingleInstance4() {
		
	}
	private static SingleInstance4 instance;
	
	public static SingleInstance4 getInstance() {
		if(null == instance) {
			synchronized (SingleInstance4.class) {
				if(null == instance) {
					instance = new SingleInstance4();
				}
			}
		}
		return instance;
	}
}

 该程序的缺点是得到的实例对象可能是一个失效的对象,因为不能保证实例对象的所有成员变量被正确完整的进行了初始化

 

5.DCl改进

public class SingleInstance5 {

	private SingleInstance5() {
		
	}
	private static volatile SingleInstance5 instance;
	
	public static SingleInstance5 getInstance() {
		if(null == instance) {
			synchronized (SingleInstance5.class) {
				if(null == instance) {
					instance = new SingleInstance5();
				}
			}
		}
		return instance;
	}
}

 加入volatile关键字可以保证该对象的可见性,已使线程得到该对象的最新值

 

综上,建议使用延迟初始化占位类模式的单利模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值