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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Single
  2. {
  3.                 private static Single s=null;
  4.                 private Single(){}
  5.                
  6.                
  7.                 public static synchronized Single getInstance()
  8.                 {
  9.                                
  10.                                         if(s==null)
  11.                                 s=new Single();
  12.                        return s;
  13.                                                           
  14.                                                              
  15.                 }
  16. }
复制代码
大家好,我有一个小小的问题,没有转过弯。就是毕老师在分析的时候就是说A线程一进锁那么B线程就进不来了,A一进来等于空,new了一个对象,返回了
一个对象,A出去了。B进来以后一判断就不等于空了。
那么我的问题是B为什么不等于空了呢?也不知道我表达的清不清楚,烦请大伙帮忙解答下,谢谢!

6 个回复

倒序浏览
因为类引用被声明为static了,如:private static Single s=null;也就是说这个类的引用在内存中只有一份,如果A进去先new到了对象,那么A就给这个类引用赋上了值,那B之后再拿着这个类的引用去判断显然是不为null的。
回复 使用道具 举报 1 0
懒汉式是单例设计模式中的一种,所谓单例就是内存中只存在一个对象。当A进去之后,已经获得了锁,B想进来必须判断锁,所以不能进来。直到A线程return s之后,B线程才能进来,在判断if(s==null),因为A已经创建了对象,所以s就不为空了。
回复 使用道具 举报
大恶魔先森~ 发表于 2014-4-26 10:41
懒汉式是单例设计模式中的一种,所谓单例就是内存中只存在一个对象。当A进去之后,已经获得了锁,B想进来必 ...

明白了,谢谢啊
回复 使用道具 举报
在A线程的时候s指向了新创建的对象,所以s不为null
回复 使用道具 举报
eternallove 发表于 2014-4-26 09:48
因为类引用被声明为static了,如:private static Single s=null;也就是说这个类的引用在内存中只有一份, ...

:):):):):)
回复 使用道具 举报
龙健 中级黑马 2014-4-26 14:51:29
7#
懒汉式是保证永远都只能创建一个对象,对于你的疑问应该是认为在A线程进入方法后,其他线程不能进入,但是此刻其他线程B也来了,你就是在判断线程是否为空有疑问。
是这样的,线程A在进入方法的时候,这时候s是null,B线程不能进入,这时s也是null,在A结束后,s就有了一个对象,不是null,B线程得到运行权,进入方法,但是此时s不为空,所以就直接返回原来创建的那一个对象,问题的焦点在他们操作的都是定义好的同一个s,因为你s是静态的,多个线程操作的是同一个s,所以、、、、、、不知道你懂我的意思吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马