shrunk是什么意思 assign是什么意思( 三 )


private static int a;//非volatile修飾變量 private static int b;//非volatile修飾變量 private static volatile int k;//volatile修飾變量 private void hello() { a = 1;//語句1 b = 2;//語句2 k = 3;//語句3 a = 4;//語句4 b = 5;//語句5 //以下省略… }變量a,b是非volatile修飾的變量,k則使用volatile修飾 。所以語句3不能放在語句1、2前,也不能放在語句4、5后 。但是語句1、2的順序是不能保證的,同理,語句4、5也不能保證順序 。
并且,執行到語句3的時候,語句1,2是肯定執行完畢的,而且語句1,2的執行結果對于語句3,4,5是可見的 。
volatile禁止指令重排序的原理是什么
首先要講一下內存屏障,內存屏障可以分為以下幾類:
LoadLoad 屏障:對于這樣的語句Load1,LoadLoad,Load2 。在Load2及后續讀取操作要讀取的數據被訪問前,保證Load1要讀取的數據被讀取完畢 。
StoreStore屏障:對于這樣的語句Store1, StoreStore, Store2,在Store2及后續寫入操作執行前,保證Store1的寫入操作對其它處理器可見 。
LoadStore 屏障:對于這樣的語句Load1, LoadStore,Store2,在Store2及后續寫入操作被刷出前,保證Load1要讀取的數據被讀取完畢 。
StoreLoad 屏障:對于這樣的語句Store1, StoreLoad,Load2,在Load2及后續所有讀取操作執行前,保證Store1的寫入對所有處理器可見 。
在每個volatile讀操作后插入LoadLoad屏障,在讀操作后插入LoadStore屏障 。

shrunk是什么意思 assign是什么意思

文章插圖
在每個volatile寫操作的前面插入一個StoreStore屏障,后面插入一個SotreLoad屏障 。
shrunk是什么意思 assign是什么意思

文章插圖
大概的原理就是這樣 。
面試官:講得還不錯,基本上都講到了,時間也不早了,今天的面試就到這吧,回去等通知吧~
總結
要學習并發編程,java內存模型是第一站了 。原子性,有序性,可見性這三大特征幾乎貫穿了并發編程,可謂是基礎知識 。對于后面要深入學習起到鋪墊作用 。
在這篇文章中,如果面試的話,重點是Java內存模型(JMM)的工作方式,三大特征,還有volatile關鍵字 。為什么喜歡問volatile關鍵字呢,因為volatile關鍵字可以扯出很多東西,比如可見性,有序性,還有內存屏障等等 ??梢砸会樢娧乜闯雒嬖囌叩募夹g水平,畢竟面試官也想高效地篩選出符合要求的人才嘛 。
本文為阿里云原創內容,未經允許不得轉載 。
本文來源于發跡號www.fajihao.com

推薦閱讀