java多线程的一个小坑

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

   先上示例代码:

java多线程的一个小坑

java多线程的一个小坑

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

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

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

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

   因此我就纳闷了:一个println语句导致同一份代码不同结果。说明println能达到跟volatile的效果。说明新线程去同步了主内存的最新数据。当点击进println源代码后会发现。

java多线程的一个小坑

   println源码进行synchronized操作。这就解开疑惑了。我们都知道synchronized在执行前后都会同步主存内容。因此这个小坑也算告一段落了。