JAVA 內存模型(主內存,工作內存)


JVM將內存組織為主內存和工作內存兩個部分。

主內存是所有的線程所共享的,主要包括本地方法區和堆。

每個線程都有一個工作內存不是共享的,工作內存中主要包括兩個部分:

1:一個是屬於該線程私有的棧;

2:對主存部分變量拷貝的寄存器(包括程序計數器PC和cup工作的高速緩存區)。

1.所有的變量都存儲在主內存中(虛擬機內存的一部分),對於所有線程都是共享的。

2.每條線程都有自己的工作內存,工作內存中保存的是主存中某些變量的拷貝,
線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存中的變量。
3.線程之間無法直接訪問對方的工作內存中的變量,線程間變量的傳遞均需要通過主內存來完成,即:線程、主內存、工作內存。

JVM規范定義了線程對內存間交互操作:

Lock(鎖定):作用於主內存中的變量,把一個變量標識為一條線程獨占的狀態。

Read(讀取):作用於主內存中的變量,把一個變量的值從主內存傳輸到線程的工作內存中。

Load(加載):作用於工作內存中的變量,把read操作從主內存中得到的變量的值放入工作內存的變量副本中。

Use(使用):作用於工作內存中的變量,把工作內存中一個變量的值傳遞給執行引擎。

Assign(賦值):作用於工作內存中的變量,把一個從執行引擎接收到的值賦值給工作內存中的變量。

Store(存儲):作用於工作內存中的變量,把工作內存中的一個變量的值傳送到主內存中。

Write(寫入):作用於主內存中的變量,把store操作從工作內存中得到的變量的值放入主內存的變量中。

Unlock(解鎖):作用於主內存中的變量,把一個處於鎖定狀態的變量釋放出來,之后可被其它線程鎖定。

在將變量從主內存讀取到工作內存中,必須順序執行read、load;
要將變量從工作內存同步回主內存中,必須順序執行store、write。
8種操作必須遵循以下規則:

1:不允許read和load、store和write操作之一單獨出現。即不允許一個變量從主內存被讀取了,但是工作內存不接受,或者從工作內存回寫了但是主內存不接受。
2:不允許一個線程丟棄它最近的一個assign操作,即變量在工作內存被更改后必須同步改更改回主內存。
3:工作內存中的變量在沒有執行過assign操作時,不允許無意義的同步回主內存。
4:在執行use前必須已執行load,在執行store前必須已執行assign。
5:一個變量在同一時刻只允許一個線程對其執行lock操作,一個線程可以對同一個變量執行多次lock,但必須執行相同次數的unlock操作才可解鎖。
6:一個線程在lock一個變量的時候,將會清空工作內存中的此變量的值,執行引擎在use前必須重新read和load。
7:線程不允許unlock其他線程的lock操作。並且unlock操作必須是在本線程的lock操作之后。

8:在執行unlock之前,必須首先執行了store和write操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM