鍍金池/ 問答/Java  Linux/ 如何理解指令重排序?qū)尉€程沒有什么影響?

如何理解指令重排序?qū)尉€程沒有什么影響?

如何理解指令重排序?qū)尉€程沒有什么影響,他不會影響程序的運行結(jié)果,但是會影響多線程。

比如:

int i = 0; //1
i = i + 1; //2
System.out.println(i); //3

如果執(zhí)行重排序,將2和3的執(zhí)行順序變了,那么肯定會影響運行結(jié)果啊。

回答
編輯回答
你好胸

你去了解一下 happens-before 就清楚了

2017年2月9日 18:19
編輯回答
怣人

指令重排不是亂排,2 3存在依賴不會倒過來。。
單線程的指令可以認為是串行執(zhí)行的,重排的只是

a = 1; // 1
b = 2; // 2
System.out.println(a); // 3
System.out.println(b); // 4

1 2 就可以倒過來,不影響結(jié)果,1 3、2 4 以及 3 4 就不會。。

2017年4月10日 08:36
編輯回答
疚幼

指令重排有個重要的前提 在單線程環(huán)境下,指令重排不能影響最終的結(jié)果,所以你這里是不能重排的。

2018年3月19日 04:12
編輯回答
夢若殤

首先你要明白指令重排序的意義:處理器在不影響最終計算結(jié)果的情況下,盡可能提高計算效率。
如何做到不影響計算最終計算結(jié)果?計算的時候是有數(shù)據(jù)依賴關(guān)系的,比如這里的printf,它是依賴數(shù)據(jù)i的,在i完成最終計算之前不輸出。或者說變量值i的計算一定是happens-before printf的。
JMM(java的內(nèi)存模型)比較特殊,happens-before關(guān)系很重要,可以了解一下。

2018年3月11日 00:16