若第2步和第3步重排序后。此时顺序是 1 3 2。线程A做完了步骤3。但是没有做步骤2。此时线程B进来判断不为null,取这个实例并使用,但是此时 实例并没有被初始化里面的值。
这里不触犯任何的happens-before规则。 且由于这三步的重排序并不影响结果,所以JMM也是允许此等操作的
为啥加volatile就可以了呢?
volatile的变量的写操作后面要插入 StoreLoad屏障。
B线程对实例的读操作一定是对象写之后执行。
若第2步和第3步重排序后。此时顺序是 1 3 2。线程A做完了步骤3。但是没有做步骤2。此时线程B进来判断不为null,取这个实例并使用,但是此时 实例并没有被初始化里面的值。
这里不触犯任何的happens-before规则。 且由于这三步的重排序并不影响结果,所以JMM也是允许此等操作的
volatile的变量的写操作后面要插入 StoreLoad屏障。
B线程对实例的读操作一定是对象写之后执行。
若有收获,就点个赞吧
0 人点赞
让时间为你证明