public class SingletonClass {
private static SingletonClass instance = null;
public static SingletonClass getInstance() {
if (instance == null) {
synchronized (SingletonClass.class) {
if (instance == null) {
instance = new SingletonClass();
}
}
}
return instance;
}
private SingletonClass() {
}
}
主要是看清检测的时机,比如当你线程A在执行 instance = new SingletonCl ass(); ** 时,它先分配了内存,然后再进行构造初始化,这里有好几步,假如刚好在分配了内存以后,还未初始化的时候,线程B来调用函数,这个时候,if (instance == null) ** 这个判断条件就为真,这样B线程就之间拿到instance 返回,然后后续使用,这个时候,就会有问题了
而volatile加入了happens-before的语义规范,被volatile修饰的写变量不能和之前的读写代码调整,读变量不能和之后的读写代码调整!因此,只要我们简单的把instance加上volatile关键字就可以了。