您的位置:首页 > Web前端

剑指offer - 实现Singleton模式

2015-09-19 18:25 477 查看
由于只生成一个实例,因此需要将类的构造函数设为私有,然后生成实例的功能由它内部的函数去实现:

解法一:(只适用于单线程模式)在多线程情况下,下面的代码可能会因为有多个线程同时执行到 if 判断语句,然后同时创建了Singleton的多个实例,从而破坏了单例模式。

class Singleton{
	private static Singleton single = null;
	
	private Singleton(){ }
	public static Singleton getSingletonObject(){
		if ( single == null ) {
			single = new Singleton();
		}
		return single;
	}
}


针对上述多线程的问题,我们需要对上述代码进行加锁处理。当一个线程在创建实例的时候,其他线程只能的等待。代码如下所示:

class Singleton{
	private static Singleton single = null;
	private static Object syncObj = new Object();

	public static Singleton getSingletonObject(){
		if ( single == null ){
			lock(syncObj){
				if ( single == null )
					single = new Singleton();
			}
		}
		return single;
	}
}


分析上述代码,假设当前有两个线程想同时创建一个实例,由于在一个时刻只有一个线程能得到同步锁,当第一个线程加上锁时,第二个线程只能等待,并由第一个线程创建出一个实例。创建之后第一个线程释放同步锁,此时第二个线程可以加上同步锁,并运行接下来的代码。由于加上同步锁后第二个线程会发现当前已经有了一个Singleton对象了,于是便不会再重复创建Singleton的实例,从而保证了单例模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: