剑指offer - 实现Singleton模式

由于只生成一个实例,因此需要将类的构造函数设为私有,然后生成实例的功能由它内部的函数去实现:

解法一:(只适用于单线程模式)在多线程情况下,下面的代码可能会因为有多个线程同时执行到 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的实例,从而保证了单例模式。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值