设计模式之单例模式的优化

本文详细探讨了单例模式在单线程和多线程环境下的实现,并重点介绍了如何优化多线程环境下的单例模式,确保其正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式是一个非常重要的设计模式,而且代码量比较少,只需要几十行代码就能实现,虽然简洁,但是想要用好单例模式还是需要些门道,以下是我对单例模式的优化的总结


一、单线程下的单例模式

public class Singleton {

	private static Instance instance = null;
	
	private Singleton(){
		
	}
	
	public static Instance getHeap(){
		
		if(instance==null){
			instance = new Instance();
		}
		return instance;
	}
	
}

注:instance是我们需要得到的实例对象。
从以上的代码可以看出最简单的单例模式也就只需要十多二十行代码量就搞定,假如是在单线程下,这样的实现也就够了。但是如果考虑多线程的话,没有一个同步机制就有可能造成有多个instance实例对象。比如有线程A和线程B,线程A执行了if(instance==null),但在执行instance = new Instance();之前,线程B执行了if(instance==null),所以最后线程A和线程B都会去执行instance = new Instance();,造成单例模式的工作效率低下。下面再来看看多线程下的单例模式是怎样的。


二、多线程下的单例模式

既然在多线程的环境下,上面谈到的单线程下的单例模式会造成工作效率低下,那就先加个synchronize关键字,使实例化的那段代码块同步,这样子就不会造成生成多个实例化对象,看看具体的代码
public class Singleton {

	private static Instance instance = null;
	
	private Singleton(){
		
	}
	
	public static Instance getHeap(){
		
		synchronized (Singleton.class) {
			if(instance==null){
				instance = new Instance();
			}
			return instance;
		}
		
	}
	
}
这样子问题似乎就解决了,但是仔细思考下的话还会存在一个问题。当每个线程需要得到instance的实例化对象的时候,都要去获取同步锁,而不能在instance=new instance()的条件下直接获得实例化对象。所以还要继续优化代码。


三、多线程下的单例模式的优化

在“二”中说到的问题其中有个解决的办法就是在同步代码块前面加个判断if(instance==null),这样子线程就不需要每次要获取实例化对象的时候都要等待同步锁,只需要在instance==null的情况下才需要去等待同步锁然后实例化对象。代码如下
public class Singleton {

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




以上就是我对于单例模式的学习和总结,如果有错误之处,希望读者能够在留言区给予指正,谢谢!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值