单例模式(Singleton)

单例模式是一个在实际的项目中用的非常多的模式,在所有的设计模式中,其实也是相对比较简单的一种模式;

该模式的意图是:确保一个类只有一个实例,并将它作为一个全局访问点

单例的实现手段是通过隐藏构造函数,提供对象创建的唯一入口点,将类的职责集中该单例中

单例模式具有两种实现模式:静态初始化和延迟初始化

静态初始化版本

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

延迟初始化版本(双重锁定)

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

其中静态初始化版本比较简单,也比较好理解,该版本在类加载初始化的时候就创建了单例;而延迟初始化版本比较容易出错,这里需要强调的是getInstance方法里面的两个null检测一个都不能少,假如缺少外面的null检测,则每次调用getInstance的时候都会加锁,对性能会造成很大影响,而这个其实是不必要的;当缺少内部的null检测时,假如有两个线程同时调用getInstance,并且都发现instance字段为null,第一个线程先获得锁并创建返回instance;这时第二个线程获得锁,但此时instance已经不为null,然而该线程同样会创建一个新的实例,这就会导致不一致的状态甚至是预想不到的结果

延迟初始化的一个好处是:当程序不需要使用单例时,它不会占用过多的资源





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值