老师,您好,我现在有一点儿懵逼,工作内存的对变量副本的修改什么时候会同步会主内存呢?
比如双重检测实现的单例模式:
public class Util {
private static Util instance;
public static Util getInstance() {
if (instance == null) {
synchronized (Util.class) {
if (instance == null) {
instance = new Util();
}
}
}
return instance;
}
public static void main(String[] args) {
Util.getInstance();
}
}
这里instance变量需要volatile修饰是因为instance = new Util();可能发生指令重排。但是我现在一想,即使A线程在执行instance = new Util();操作的时候,发生了重排,先把内存空间地址设置到了instance变量,然后再初始化内存空间。但是因为给instance变量赋值的操作是在A线程内发生的,这时赋值的目标应该是instance变量在A线程工作内存的副本才对啊,当B线程来获取instance的时候,如果A线程没有把最新值(不论是有没有被初始化完成的对象)同步到主内存,那么B线程从主内存获取instance的结果应该也是空才对啊,就不会出现获取到一个没有初始化好的对象的情况啊。
谢谢老师解答!