JMM如何解决顺序一致性问题-重排序问题
為了提高程序的執(zhí)行性能,編譯器和處理器都會(huì)對(duì)指令做重排序,其中處理器的重排序在前面已經(jīng)分析過了。所謂的重排序其實(shí)就是指執(zhí)行的指令順序。?
編譯器的重排序指的是程序編寫的指令在編譯之后,指令可能會(huì)產(chǎn)生重排序來優(yōu)化程序的執(zhí)行性能。
從源代碼到最終執(zhí)行的指令,可能會(huì)經(jīng)過三種重排序。
?2和3屬于處理器重排序。這些重排序可能會(huì)導(dǎo)致可見性問題。
編譯器的重排序,JMM提供了禁止特定類型的編譯器重排序。
處理器重排序,JMM會(huì)要求編譯器生成指令時(shí),會(huì)插入內(nèi)存屏障來禁止處理器重排序
當(dāng)然并不是所有的程序都會(huì)出現(xiàn)重排序問題
編譯器的重排序和CPU的重排序的原則一樣,會(huì)遵守?cái)?shù)據(jù)依賴性原則,編譯器和處理器不會(huì)改變存在數(shù)據(jù)依賴關(guān)系的兩個(gè)操作的執(zhí)行順序,比如下面的代碼,
a=1; b=a;?
a=1;a=2;?
a=b;b=1;
這三種情況在單線程里面如果改變代碼的執(zhí)行順序,都會(huì)導(dǎo)致結(jié)果不一致,所以重排序不會(huì)對(duì)這類的指令做優(yōu)化。這種規(guī)則也成為as-if-serial。不管怎么重排序,對(duì)于單個(gè)線程來說執(zhí)行結(jié)果不能改變。比如
int a=2; //1?
int b=3; //2?
int rs=a*b; //3?
1和3、2和3存在數(shù)據(jù)依賴,所以在最終執(zhí)行的指令中,3不能重排序到1和2之前,否則程序會(huì)報(bào)錯(cuò)。由于1和2不存在數(shù)據(jù)依賴,所以可以重新排列1和2的順序
?
總結(jié)
以上是生活随笔為你收集整理的JMM如何解决顺序一致性问题-重排序问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JMM 是如何解决 可见性有序性问题的
- 下一篇: JMM如何解决顺序一致性问题-JMM层面