1. 程式人生 > >Java記憶體模型(Java Memory Model)簡易描述

Java記憶體模型(Java Memory Model)簡易描述

一、概述
關於現代CPU與Cache、RAM之間的資料與指令互動以及由此產生的一致性問題解決方案如MESI等這裡就不說了,網上也有很多文章講解到這些,這裡說一下Java虛擬機器的記憶體模型。

二、Java中的主記憶體與工作記憶體

1.主記憶體(Main Memory)
主記憶體可理解為Java虛擬機器所擁有和管理的那一部分實體記憶體,所有的變數都儲存於主記憶體中,這裡的變數包括了例項欄位、靜態欄位、陣列元素,但不包括區域性變數和方法的引數(因為這兩者為執行緒私有)。

  1. 工作記憶體(Working Memory)
    工作記憶體與Cahce類似,執行緒的工作記憶體中儲存著該執行緒需要使用到的變數的副本,這些副本是從主記憶體拷貝而來。而執行緒對變數的所有操作都需要在工作記憶體中完成。
    1. 工作記憶體與主記憶體之間的互動
      Java虛擬機器規範裡面規定了8種原子操作來描述兩者之間的資料互動,分別是: lock、read、load、use、assign、store、write、unlock;Java虛擬機器規範裡面明確指定了read和load操作、store和write操作這兩組必須順序執行,兩者之間不能插入其他指令,也不允許這四個指令之一單獨出現。類似的約束還有:assign操作使得工作記憶體中的資料的值發生改變,必須store到工作記憶體中並write到主記憶體,但是沒有經過assign操作的資料,不能進行此操作。對一個變數執行use、store操作之前,必須先執行assign和load指令,以初始化變數。同一時刻只允許一個執行緒對一個變數執行lock操作,同一條執行緒也可以多次執行lock操作作用於同一個變數,但是一旦有執行緒對某一個變數執行了lock操作,那麼之前存在於工作記憶體中的這個變數的值會被清空。執行引擎要是用這個變數的話,必須執行load或者assign。
    2. 關於volatile關鍵字
      算是一個輕量級鎖機制。為什麼叫輕量級呢,因為被volatile關鍵字修飾的變數,依然是在各個執行緒的工作記憶體中儲存了副本,可以出現每個執行緒工作記憶體中其值不一致的情況,但是每次使用volatile修飾的關鍵字的變數之前都要有一步重新整理的動作,重新整理之後對執行引擎來說看不到不一致的情況,因此呢,volatile修飾的關鍵字可以保持對其他執行緒的可見性,也即一旦某個執行緒修改了volatile修飾的一個變數的值,那麼其他執行緒立即可見。所以可以確保被volatile修飾的關鍵字,在只有一個執行緒對其有寫操作時,或者說不依賴這個變數當前值的時候,在各個執行緒的工作記憶體中不存在一致性問題。


作者:CaramelMacchiato
連結:https://www.imooc.com/article/19273?block_id=tuijian_wz
來源:慕課網