目录
编译期指令重排1、上神秘代码2、编译成java字节码(没加volatile)3、编译成Java字节码(加了volatile)4、编译器优化运行期指令重排那什么时候会产生指令重排现象呢?两个阶段:1、编译期;2 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("基友找到笔了,送过去..."); change(); } }, "基友线程").start(); } public static void change() { found = 1; }}
稍微解释下这段代码:有两个线程:我线程、基友线程。『我线程』通过死循环阻塞在那里等待『基友线程』找到笔送过来,然后开始写字。『基友线程』等待一会就去找笔,找到了就送过去。
2、编译成Java字节码(没加volatile)
efore是做什么的呢?简单的说就是告诉写JVM的人,你写JVM的时候要遵循这几条规则,这几条规则是你JVM默认要做到的,而不用程序猿在写代码的时候需要去想去做控制。比如对象的初始化动作一定要先于finalize方法执行前完成。其他几个规则我就不细说了,都很好理解,童鞋们自行去学习下。
有些流程的顺序是可以提前知晓并确定下来,但有些流程的顺序是无法提前知晓的,比如你公司的业务,写JVM的人肯定不知道,所以依然需要程序猿根据业务需要来控制,那从JVM层面来说,我给你提供机制。内存屏障就是这种机制中的一种,其他的还有各种锁。关于内存屏障,我之前已经写了一篇文章深入讲解了这块,有兴趣的同学可以去看看,传送门 内存屏障由来及实现思路
以上就是关于指令重排现象的两个阶段详解的详细内容,更多关于指令重排现象的两个阶段的资料请关注我们其它相关文章!










