版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StarsionBlog/article/details/63254271
单例模式是一个非常重要的设计模式,而且代码量比较少,只需要几十行代码就能实现,虽然简洁,但是想要用好单例模式还是需要些门道,以下是我对单例模式的优化的总结
一、单线程下的单例模式
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;
}
}
以上就是我对于单例模式的学习和总结,如果有错误之处,希望读者能够在留言区给予指正,谢谢!