分析一个比较简单的东西:
分析一下执行过程以及为什么出错
原来,INSTANCE是null。
有A、B两个线程。
A执行到第21行,一看INSTANCE是null,就进synchronized块儿了(第24行)。
注意:这时候INSTANCE还是null,因为第25行没有执行。
正在这时,B来了,因为getInstance方法木有加synchronized关键字,所以B能进去这个方法,B走到21行,一看INSTANCE还是null,就继续往下执行,但是这时候locker被A霸占着,B没办法,就只好在这儿等着A释放掉锁,然后才能往下执行。
当A执行完synchronized方法,A释放掉了锁、创建一个Singleton对象赋给了INSTANCE并且返回出去。但是B已经等了半天了,它是不可能会拐回去的,这时候B就得到了那个锁,就进去synchronized块儿了,就又创建一个Singleton对象赋给了INSTANCE,并且返回出去。
很显然,A、B得到的两个Singleton对象并不是同一个。所以这个单例是有问题的。
所以,该怎么修改呢?下面这个图上面的还会出问题吗?