Java併發編程--7.Java內存操做總結

主內存和工做內存

工做規則

Java內存模型, 定義變量的訪問規則, 即將共享變量存儲到內存和取出內存的底層細節    緩存

全部的變量都存儲在主內存中,每條線程有本身的工做內存,工做內存中用到的變量, 是從主內存拷貝的副本,線程對變量的全部操做都在工做內存中進行, 線程間變量值得傳遞均需經過主內存來完成

內存間交互操做

1、luck(鎖定):做用於主內存的變量,它把一個變量標示爲一條線程獨佔的狀態。

2、unlock(解鎖):做用於主內存的變量,它把一個處於鎖定狀態的變量釋放出來,釋放後的變量才能夠被其餘線程鎖定。

3、read(讀取):做用於主內存的變量,它把一個變量的值從主內存傳輸到工做內存中,以便隨後的load動做使用。

4、load(載入):做用於工做內存的變量,它把read操做從主內存中獲得的變量值放入工做內存的變量副本中。

5、use(使用):做用於工做內存的變量,它把工做內存中的一個變量的值傳遞給執行引擎,每當虛擬機遇到一個須要使用到變量的值得字節碼指令時將會執行這個操做。

6、assign(賦值):做用於工做內存的變量,它把一個從執行引擎接收到的值賦給工做內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操做。

7、store(存儲):做用於工做內存的變量,它把工做內存中的一個變量的值傳遞到主內存中,以便隨後的write操做使用。

8、write(寫入):做用於主內存的變量,它把store操做從工做內存中獲得的變量值放入主內存的變量中。

上述操做,必須知足如下的規則:app

 1、不容許read和load、store和write操做之一單獨出現,以上兩個操做必須按順序執行,但沒有保證必須連續執行,也就是說,read與load之間、store與write之間是可插入其餘    指令的。

 2、不容許一個線程丟棄它的最近的assign操做,即變量在工做內存中改變了以後必須把該變化同步回主內存。

 3、不容許一個線程無緣由地(沒有發生過任何assign操做)把數據從線程的工做內存同步回主內存中。

 4、一個新的變量只能從主內存中「誕生」,不容許在工做內存中直接使用一個未被初始化(load或assign)的變量,換句話說就是對一個變量實施use和store操做以前,必須先執行過  了assign和load操做。

 5、一個變量在同一個時刻只容許一條線程對其執行lock操做,但lock操做能夠被同一個條線程重複執行屢次,屢次執行lock後,只有執行相同次數的unlock操做,變量纔會被解鎖。

 6、若是對一個變量執行lock操做,將會清空工做內存中此變量的值,在執行引擎使用這個變量前,須要從新執行load或assign操做初始化變量的值。

 7、若是一個變量實現沒有被lock操做鎖定,則不容許對它執行unlock操做,也不容許去unlock一個被其餘線程鎖定的變量。

 8、對一個變量執行unlock操做以前,必須先把此變量同步回主內存(執行store和write操做)。 

happen-before

共享數據的讀寫操做, 若是不知足happen-bifore條件, 就沒有順序性的保障, 虛擬機能夠對他們進行重排序性能

重排序

也就是說只要程序的最終結果等同於它在嚴格的順序化環境下的結果,那麼指令的執行順序就可能與代碼的順序不一致,這個過程經過叫作指令的重排序優化

 

指令重排序存在的意義在於:JVM可以根據處理器的特性(CPU的多級緩存系統、多核處理器等)適當的從新排序機器指令,使機器指令更符合CPU的執行特色,最大限度的發揮機器的性能spa

特殊的內存操做

volatile修飾的變量: 可見性; 禁止指令重排序優化線程


final域 : 被final修飾的字段在構造器中一旦被初始化完成,在其餘線程中就能看到final字段的值code


long和double型變量的特殊規則 : 除了long和double類型, 其餘的基本類型和引用類型的賦值操做都爲原子操做blog

相關文章
相關標籤/搜索