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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qq8921310 高级黑马   /  2014-11-28 13:37  /  1145 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

懒汉式不加锁,
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))虽然替换了一次好像没有违反单例的原则啊。而且被替换的由于没有引用也被回收掉了。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

6 个回复

倒序浏览
A线程和B线程获得的对象不是同一个,A线程调用该函数时,假设是这种形式,a = Demo.getInstance();,那么这时s指向的对象会传递给a,同理B线程也是如此, b = Damo.getInstance();这时,s指向的对象(不同于A线程中的对象)传递给b,这自然违反单例原则了。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
返回的是两个对象,    先把new出来的S给了A,这时A拿到的是一个对象,这时A已经拿到了一对象出去了   然后又new了一个S,把之前那个S替换了,然后给了B ,B就也拿到了一个对象出去了
这样A拿到的是之前的对象,B拿到的是后一个对象
虽然懒汉式里面只存在一个S对象,但是已经送出去了两个对象  就已经违反单例原则了      
回复 使用道具 举报
学习了。。。。
回复 使用道具 举报
如果A线程new完B线程马上抢到资源new了,确实会替换,但是如果A线程new完已经return了,B再new,这时两个线程拿到的对象就不是同一个对象了
回复 使用道具 举报
路过,学习下!!
回复 使用道具 举报
不加锁,怎么都会是可能多个线程访问同一块。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马