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

图片说明

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

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

这个叫做double lock check
http://blog.csdn.net/qq276592716/article/details/8274037

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

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

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