JVM的指令重排

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,则直接进行了使用,不再进行初始化,这显然会出错。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值