黑马程序员技术交流社区

标题: 懒汉模式(多线程) [打印本页]

作者: 于星星    时间: 2012-7-18 14:02
标题: 懒汉模式(多线程)
  1. class Single
  2. {
  3.          private static Single ss =null;
  4.          private Single(){}
  5.          
  6.         public static Single getInstance()
  7.          {
  8.                  if(ss==null)
  9.                  {
  10.                          synchronized(Single.class)
  11.                          {
  12.                                  if(ss==null)
  13.                                  ss = new Single();                        
  14.                         }
  15.                  }
  16.                  return ss ;
  17.          }
  18. }
复制代码
在看视频时有一个问题。为什么这里需要判断两次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