A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-18 14:02  /  1699 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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是否为空,判断一次不就行了。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
zhaosenyang 来自手机 黑马粉丝团 2012-7-18 18:27:47
沙发
这个过程形象点说会好理解。先说判断两次的流程。A程序调用方法,判断ss==null,成立进来了(假如此时cpu切换了,A挂起,另一个程序B进来,继续执行,一个道理。总体说,谁先上锁,谁就进来。只会有一个程序进来。)继续说A程序,进来以后,上锁,此时如果挂起,其它程序已经进不来了,等待cpu切换回来,A继续执行,此时判断ss==null'依然成立,接着就创建对象,然后返回s。这时就算B重新被执行进来以后ss的值已经不为空,也就不会再建立对象,这样就实现了对象的唯一性。
假如就判断一次,如果此时A程序调用方法判断条件成立进来了,然后挂了,B程序也进来了,没挂,锁门,建立对象,走了。A程序又活了,然后锁门,又建立对象,这就失去单例设计模式的意义了。

判断两次就是怕一个程序进来了,挂了,另一个程序也进来了,执行上锁后,就能保证判断第二次条件的时候只有一个程序,然后只创建一个对象。当其它程序再进来的时候,条件不再成立,就不会再创建对象了。

我晕,手机编辑的,有点乱。我也是今天刚学完这个知识点,我全当复习了,不知道我这么抽象得说你能理解不?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马