有關volatile修飾詞

1.定義:用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的最的值。 2.語義: 第一:保證線程之間變量的可見性。簡單地說就是當線程A對變量X進行修改後,在線程A後執行的其餘線程能看到變量X的變化。更纖細的說是符合兩個規則: *線程對變量進行修改以後,要馬上寫到主內存。 *線程對變量讀取的時候,要從主內存中讀,而不是緩存。java

有關線程執行過程當中住內存和緩存,能夠進行以下解釋。

JAVA 爲了保證其平臺型,使JAVA應用程序和操做系統內存模型隔離開,須要定義本身的內存模型。在java內存模型中,內存分爲主內存和工做內存兩個部分,其中主內存是全部線程所共享的,而工做內存則是每一個線程分配一份,各線程的工做內存彼此獨立,互補課件,在線程啓動的時候,虛擬機爲每一個內存分配一塊工做內存,不只包含了線程內部定義的局部變量,也包含了線程所須要使用的共享變量(非線程內構造對象)的副本,即爲了提升執行效率,讀取副本比直接讀取主內存更快(這裏能夠簡單地將主內存理解爲虛擬機中的堆,而工做內存理解爲棧) 輸入圖片說明 對於共享普通變量來講,約定了變量在工做內存中發生變化以後,必需要回寫到工做內存(早晚要回寫,並非立刻回寫),但對於volatile修飾的變量,則要求在工做內存中發生變化以後,必須立刻回寫到工做內存(之因此是工做內存是由於,原來的變化是在工做內存的副本中進行),而線程讀取volatile變量的時候,必須立刻到工做內存中去取最新值,而不是讀取本地工做內存的副本,此規則保證了前面所說的「當線程A對變量X進行修改後,在線程A後面執行的其餘線程能看到變量X的變更。」 工做內存副本變更-工做內存變更-新的線程讀取主內存的時候共有變量的值已經變化爲最新值。緩存

重點詳解:工做內存能夠說是內存的一份緩存,爲了不緩存的不一致性,因此volatile須要廢棄此緩存,但除了內存緩存以外,在CPU硬件級別也是有緩存的,即寄存器。加入線程A將變量X由0修改成1的時候,CPU是在其緩存內操做,沒有及時回寫到內存,那麼JVM是沒法X=1是能及時被以後執行的線程B看到的。而JVM在處理volatile變量的時候,也一樣用了硬件級別的緩存一致性原則。 第二:禁止指令重排序。如同咱們在另外一片博客《懶漢式和餓漢式》中所用到的一致。操作系統

相關文章
相關標籤/搜索