class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null) //1
{
synchronized(Single.class)
{
if(s==null) //2
-->A
s = new Single();
}
}
return s;
}
}
疑问1:A初始化出去之后,B再进来,为什么在2处判断不为空?
疑问2:C再进来,为什么1处也不为空了,为什么连锁都不读了?
请高手解答 作者: 邱泉 时间: 2012-7-6 20:17
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null) //1
{
synchronized(Single.class) //2
{
if(s==null) //3
-->A //4
s = new Single();
}
}
return s;
}
}
1.A线程先访问,在4处挂起,访问未结束,此时s=null。
2.同时B线程访问,1处判断为真,进入2处被锁住(因为此时A线程还未结束访问)。
3.B线程挂起,A线程继续执行, s = new Single(),s!=null,A线程结束访问。
4.B线程继续执行,3处判断为假,跳过if语句继续往下执行,直到结束。
5.C线程访问,1处判断为假(此时s!=null),不执行synchronized(Single.class),跳过if判断继续执行直到结束。