DCL单例为什么要加volatile?

288 阅读1分钟
class T {
    int m = 8;
}
T t = new T();
0 new #2 <T>
3 dup
4 invokespecial #3 <T.<init>>
7 astore_1
8 return

首先new一个对象的时候会申请一块内存空间, m = 0;然后执行构造方法,这时候m = 8;

由于创建对象的时候,thread1执行了半初始化,这时候有可能发生了指令的重排,thread2获得t不为空,直接就使用了半初始化的t,所以需要加volatile。