如何理解指令重排序对单线程没有什么影响,他不会影响程序的运行结果,但是会影响多线程。
比如:
int i = 0; //1
i = i + 1; //2
System.out.println(i); //3
如果执行重排序,将2和3的执行顺序变了,那么肯定会影响运行结果啊。
如何理解指令重排序对单线程没有什么影响,他不会影响程序的运行结果,但是会影响多线程。
比如:
int i = 0; //1
i = i + 1; //2
System.out.println(i); //3
如果执行重排序,将2和3的执行顺序变了,那么肯定会影响运行结果啊。
指令重排不是乱排,2
3
存在依赖不会倒过来。。
单线程的指令可以认为是串行执行的,重排的只是
a = 1; // 1
b = 2; // 2
System.out.println(a); // 3
System.out.println(b); // 4
像 1
2
就可以倒过来,不影响结果,1
3
、2
4
以及 3
4
就不会。。
4 回答1.3k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答718 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.7k 阅读
2 回答1.3k 阅读
首先你要明白指令重排序的意义:处理器在不影响最终计算结果的情况下,尽可能提高计算效率。
如何做到不影响计算最终计算结果?计算的时候是有数据依赖关系的,比如这里的printf,它是依赖数据i的,在i完成最终计算之前不输出。或者说变量值i的计算一定是happens-before printf的。
JMM(java的内存模型)比较特殊,happens-before关系很重要,可以了解一下。