示例代码
public class Singleton {
private static Singleton singleton;
public static Singleton getInstance(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
原因:
在代码执行到singleton = new Singleton();
时,这一步会分解成3个步骤:
- 1.分配内存空间
- 2.创建对象
- 3.singleton引用指向内存空间
分析:
正常的执行顺序是:1,2,3.但是因为指令排序的原因,有可能执行顺序是:1,3,2.
当线程A执行了1,3后,让出时间片(时间片不是锁),这个时候线程B发现singleton不是null,直接返回,就会有问题.
解决办法:
用volatile
关键字修饰singleton
防止指令重排序,那么执行顺序就必定是1,2,3了.
网友评论