JMM如何解决顺序一致性问题-重排序问题
生活随笔
收集整理的這篇文章主要介紹了
JMM如何解决顺序一致性问题-重排序问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了提高程序的執行性能,編譯器和處理器都會對指令做重排序,其中處理器的重排序在前面已經分析過了。所謂的重排序其實就是指執行的指令順序。?
編譯器的重排序指的是程序編寫的指令在編譯之后,指令可能會產生重排序來優化程序的執行性能。
從源代碼到最終執行的指令,可能會經過三種重排序。
?2和3屬于處理器重排序。這些重排序可能會導致可見性問題。
編譯器的重排序,JMM提供了禁止特定類型的編譯器重排序。
處理器重排序,JMM會要求編譯器生成指令時,會插入內存屏障來禁止處理器重排序
當然并不是所有的程序都會出現重排序問題
編譯器的重排序和CPU的重排序的原則一樣,會遵守數據依賴性原則,編譯器和處理器不會改變存在數據依賴關系的兩個操作的執行順序,比如下面的代碼,
a=1; b=a;?
a=1;a=2;?
a=b;b=1;
這三種情況在單線程里面如果改變代碼的執行順序,都會導致結果不一致,所以重排序不會對這類的指令做優化。這種規則也成為as-if-serial。不管怎么重排序,對于單個線程來說執行結果不能改變。比如
int a=2; //1?
int b=3; //2?
int rs=a*b; //3?
1和3、2和3存在數據依賴,所以在最終執行的指令中,3不能重排序到1和2之前,否則程序會報錯。由于1和2不存在數據依賴,所以可以重新排列1和2的順序
?
總結
以上是生活随笔為你收集整理的JMM如何解决顺序一致性问题-重排序问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JMM 是如何解决 可见性有序性问题的
- 下一篇: JMM如何解决顺序一致性问题-JMM层面