黑马程序员技术交流社区
标题:
懒汉模式(多线程)
[打印本页]
作者:
于星星
时间:
2012-7-18 14:02
标题:
懒汉模式(多线程)
class Single
{
private static Single ss =null;
private Single(){}
public static Single getInstance()
{
if(ss==null)
{
synchronized(Single.class)
{
if(ss==null)
ss = new Single();
}
}
return ss ;
}
}
复制代码
在看视频时有一个问题。为什么这里需要判断两次ss是否为空,判断一次不就行了。
作者:
zhaosenyang
时间:
2012-7-18 18:27
这个过程形象点说会好理解。先说判断两次的流程。A程序调用方法,判断ss==null,成立进来了(假如此时cpu切换了,A挂起,另一个程序B进来,继续执行,一个道理。总体说,谁先上锁,谁就进来。只会有一个程序进来。)继续说A程序,进来以后,上锁,此时如果挂起,其它程序已经进不来了,等待cpu切换回来,A继续执行,此时判断ss==null'依然成立,接着就创建对象,然后返回s。这时就算B重新被执行进来以后ss的值已经不为空,也就不会再建立对象,这样就实现了对象的唯一性。
假如就判断一次,如果此时A程序调用方法判断条件成立进来了,然后挂了,B程序也进来了,没挂,锁门,建立对象,走了。A程序又活了,然后锁门,又建立对象,这就失去单例设计模式的意义了。
判断两次就是怕一个程序进来了,挂了,另一个程序也进来了,执行上锁后,就能保证判断第二次条件的时候只有一个程序,然后只创建一个对象。当其它程序再进来的时候,条件不再成立,就不会再创建对象了。
我晕,手机编辑的,有点乱。我也是今天刚学完这个知识点,我全当复习了,不知道我这么抽象得说你能理解不?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2