这个版本的代码看起来有点复杂,注意其中有两次if (instance == null)的判断,这个叫做『双重检查Double-Check』。
· 第一个if (instance == null),其实是为了解决Version2中的效率问题,只有instance为null的时候,才进入synchronized的代码段——大大减少了几率。
· 第二个if (instance == null),则是跟Version2一样,是为了防止可能出现多个实例的情况。
终极版本:volatile
对于Version3中可能出现的问题(当然这种概率已经非常小了,但毕竟还是有的嘛~),解决方案是:只需要给instance的声明加上volatile关键字即可,
volatile关键字的一个作用是禁止指令重排,把instance声明为volatile之后,对它的写操作就会有一个内存屏障(什么是内存屏障?),这样,在它的赋值完成之前,就不用会调用读操作。