设计模式 单例模式的一个问题 望大神指点一二

图片说明

6个回答

有这样的一种情况:
假设有T1和T2两个线程。这个时候 instance 为null
T1执行到 if(instance==null) 时并且判断完了,返回true。但是线程这个时候被暂停了,被t2抢到了cpu执行权。
T2执行完 getInstance 方法,并返回了instance对象。
这个时候T1执行,如果没有再次判断 if(instance==null) 的话,将再次创建一个instance 对象。

为了程序的执行效率,比如你锁定程序,我不用在外面傻等,如果判断为null,我就走了不等你了。

hongyu83916
hongyu83916 回复caozhy: 假如有2个线程,第一个进去,锁定代码正在创建第一个实例。第2个线程就在锁定的代码外等,等第一个创建好释放了锁,第二个线程拿到锁,才可以判断是否为null.如果有2层判断就不会发生这样的情况,代码效率就提高了。还有,我想说的是,在这里大家都是学习的,学习是认真的,也许学的不深,但绝对不会乱说。
3 年多之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 想当然地乱说
3 年多之前 回复

不多余,加锁也有耗时,加锁后可能就变了

这个文章可能写得不是很明白,我补充下,外面的 == null 是不可靠的。因为存在外面执行的时候是null,但是在执行synchronized前被另一个线程赋值的情况(虽然概率很低)
但是synchronized后,那么别的线程不能再操作了,里面的 == null 判断才是可靠的

虽然看起来是一个单例设计模式的问题,但其实是线程的问题。如果说,程序是从头到尾都是单线程在跑,确实多余了,但是实际上一般不可能是单线程的,
所以第二个判断是必须加的,不加如果多线程并发,立马出现问题。还有就是不要质疑这种经典的设计模式。被用的那么广,肯定是被认可的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐