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操作。