Cpu指令重排_cpu的指令集(CPUCPU报价及图片大全)
生活随笔
收集整理的這篇文章主要介紹了
Cpu指令重排_cpu的指令集(CPUCPU报价及图片大全)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Cpu為了提高效率會對指令進行重排序,以適合cpu的順序運行。但是指令重排會遵守As-if-serial的規則,就是所有的動作(Action)都可以為了優化而被重排序,但是必須保證它們重排序后的結果和程序代碼本身的應有結果是一致的。所以這種情況在單線程中不會出現什么問題。而對于多線程,這個規則就失效了,所以可能會導致結果出現問題。
解決辦法就是內存屏障,也叫內存柵欄。是一種屏障指令,cpu指令。Java中的實現方式就是使用volatile關鍵字,既可以解決可見性,又可以禁止指令重排。
硬件層的內存屏障有Load Barrier和Store Barrier即讀屏障和寫屏障。而java層的屏障有四種,分別是上面兩種的組合,分別是:
LoadLoad屏障:
抽象場景:Load1; LoadLoad; Load2
Load1 和 Load2 代表兩條讀取指令。在Load2要讀取的數據被訪問前,保證Load1要讀取的數據被讀取完畢。
StoreStore屏障:
抽象場景:Store1; StoreStore; Store2
Store1和Store2代表兩條寫入指令。在Store2寫入執行前,保證Store1的寫入操作對其它處理器可見
LoadStore屏障:
抽象場景:Load1; LoadStore; Store2
在Store2被寫入前,保證Load1要讀取的數據被讀取完畢。
StoreLoad屏障:
抽象場景:Store1; StoreLoad; Load2
在Load2讀取操作執行前,保證Store1的寫入對所有處理器可見。StoreLoad屏障的開銷是四種屏障中最大的。
volatile做了什么?
在一個變量被volatile修飾后,JVM會為我們做兩件事:
1.在每個volatile寫操作前插入StoreStore屏障,在寫操作后插入StoreLoad屏障。
2.在每個volatile讀操作前插入LoadLoad屏障,在讀操作后插入LoadStore屏障。
總結
以上是生活随笔為你收集整理的Cpu指令重排_cpu的指令集(CPUCPU报价及图片大全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP ABAP实用技巧介绍系列之 AB
- 下一篇: 计算机中mem指的是什么意思