JVM在执行代码的时候,在不影响最终结果的基础上,可能性的会对指令进行重排 。
例如 : a = 2 ,b = a+3, c=5 .
重排后,可能是 :a = 2 , c=5,b = a+3。
当然上面这个例子看不出什么影响 。
再来看看 new Object()的例子 。
在JVM中,new Object()并不属于原子操作,对于 Object a = new Object(),会分为3条指令
1、在内存中分配内存 2、初始化init 3、将对象引用a指向内存空间 。
一般情况下,顺序会是123,但是不排除变成132.
很多时候,我们使用资源类的时候,通常会判断是否为null,为null则进行初始化 。
现在假定有2个线程A和B , A对资源执行initResource(),B使用getResource();
正常情况下,A执行顺序按照上面的123进行执行,那么B在使用resource的时候永远不会是未初始化过多,
但是如果顺序变成了132,当A执行到第3步的时候,B判断resource不为null,则直接进行了使用,不再进行初始化,这显然会出错。