java多线程的一个小坑(重排序问题)

今日在测试volatile与synchronized特性的时候遇到的一个坑:

   先上示例代码:

图1和图2代码本质上的区别是  新线程的i=i+1操作下多了println操作。

本质上的流程来说。讲status设置为false后应该打印i++多次后的结果。但是由于新线程status一开始是保存在工作内存中。

没有同步主内存中的status。因此while循环会一直执行。因此图1是正确的结果。但是图2加了输出操作后。发现while循环

中断了。相当于status加了volatile的效果。

以上只是验证前的猜测,但是如果只是工作内存的问题,那在多次运行的情况下,应该是少次出现上述问题,而不是一直出现(工作内存会自动同步到主内存中,上述问题猜测的话也是在多线程情况下会出现的可见性问题)。

后来验证得知是因为jit(即时编译器对运行的代码做了重排序的问题)

该代码while循环,即时编译器做了优化。运行时变成如下代码:

由此验证上述存在的问题。

   因此说明println能达到跟volatile的效果。说明println禁用了重排序。当点击进println源代码后会发现。

   println源码进行synchronized操作。这就解开疑惑了。我们都知道synchronized会禁用重排序。因此这个小坑也算告一段落了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值