标签:
public Singleton
{
public static Singleton singleton;
public static Singleton GetInstance()
{
if(singleton == null)
{
singleton = new Singleton();
return singleton;
}
return singleton;
}
}
1、多线程下 使用单例模式时可能会创建多个实例这一现象的解决方案。
可以先将一个线程锁定。
多线程访问GetInstance()中的if语句,比如,有两个线程同时到达
如果Singleton !=null 的话,那么上面的问题是不会存在的,因为已经存在这个实例了,这样的话,所有的线程都无法进入if语句。
也就是所有的线程都无法调用new Singleton()了。
这样还可以保证应用程序生命周期中的实例只有一个。
如果此时singleton == null 的话,那么意味着都是可以进入if语句的。
那么就有可能出现的到哪里中有多个实例的问题。
此时,我可以让一个线程先进入if语句块,然后我在外面对这个if语句块加锁,
对第二个线程呢,由于if语句进行了加锁处理,所以这个进程就无法进入if语句块而处于阻塞状态。
当进入了if语句块的线程完成new Singleton()后,这个线程便会退出if语句块。
此时第二个线程就从
public Singleton
{
public static Singleton singleton;
public Object object;
public static Singleton GetInstance()
{
if(singleton == null)//这个是很有必要的,防止每次进入的是都有去锁定程序块,这样如果singleton!=null的时候就不用过去锁定程序快乐
{
synchronized(object)
{
if(singleton==null)
{
singleton = new Singleton();
return singleton;
}
}
}
return singleton;
}
}
标签:
原文地址:http://www.cnblogs.com/lobsterIT/p/4884560.html