黑马程序员技术交流社区

标题: 关于单例设计--懒汉式的问题 [打印本页]

作者: qq8921310    时间: 2014-11-28 13:37
标题: 关于单例设计--懒汉式的问题
懒汉式不加锁,
if (s == null)
A---》
B---》
s = new Single()
return s;
问题当A ,B两个线程有可能同时new 出对象。但是 s 只有一个,无非就是把  B new 出来的对象,把A 替换掉了。返回的仍然还是一个对象啊。(本来是return S(= new A))替换成了 (return S (= new B))虽然替换了一次好像没有违反单例的原则啊。而且被替换的由于没有引用也被回收掉了。
作者: 李天富    时间: 2014-11-28 14:49
A线程和B线程获得的对象不是同一个,A线程调用该函数时,假设是这种形式,a = Demo.getInstance();,那么这时s指向的对象会传递给a,同理B线程也是如此, b = Damo.getInstance();这时,s指向的对象(不同于A线程中的对象)传递给b,这自然违反单例原则了。
作者: Quasimodo    时间: 2014-11-28 22:41
返回的是两个对象,    先把new出来的S给了A,这时A拿到的是一个对象,这时A已经拿到了一对象出去了   然后又new了一个S,把之前那个S替换了,然后给了B ,B就也拿到了一个对象出去了
这样A拿到的是之前的对象,B拿到的是后一个对象
虽然懒汉式里面只存在一个S对象,但是已经送出去了两个对象  就已经违反单例原则了      
作者: Afridoce    时间: 2014-11-29 10:16
学习了。。。。
作者: (づ ̄_3 ̄)づ    时间: 2014-11-29 11:35
如果A线程new完B线程马上抢到资源new了,确实会替换,但是如果A线程new完已经return了,B再new,这时两个线程拿到的对象就不是同一个对象了
作者: boycechan    时间: 2014-11-29 11:48
路过,学习下!!
作者: lwh316658735    时间: 2014-11-29 12:04
不加锁,怎么都会是可能多个线程访问同一块。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2