1. 程式人生 > >Java記憶體模型解析

Java記憶體模型解析

一.java記憶體模型的誕生原因以及作用

  1.誕生原因

    java虛擬機器中規範定義的一種記憶體模型,來遮蔽調各種硬體和作業系統之間的記憶體訪問差異,為了實現java程式在各種平臺都能達到一致的記憶體訪問效果。這是它誕生的緣由。

  2.作用

    其實這個記憶體模型主要就是去定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體中取出來的底層細節,這裡的變數,是指例項欄位,靜態欄位,陣列等,不包括區域性變數和方法引數。

二.記憶體模型概述

  1.主記憶體

    所以的變數都存在主記憶體,這裡的記憶體也就是虛擬機器的記憶體,就是虛擬機器在執行時,系統分給虛擬機器的記憶體。

  2.工作記憶體

    工作記憶體儲存了該執行緒使用到的變數的主記憶體副本拷貝,執行緒對變數的操作必須在工作記憶體內進行.

                                                     

   3.記憶體間的互動操作

    lock(鎖定):作用於主記憶體的變數,把一個變數標識為一條執行緒獨佔的狀態。

    unlock(解鎖):釋放鎖定的變數,這時才可以被其他執行緒鎖定。

    read(讀取):主記憶體讀到工作記憶體。

    load(載入):把從主記憶體中的獲取的變數放入工作記憶體的變數副本中。

    use(使用):把工作記憶體的變數載入到執行引擎,當虛擬機器遇到一個需要使用變數的位元組碼的指令時會用到。

    assign(賦值):執行引擎到工作記憶體。

    store(儲存):工作記憶體傳到主記憶體。

    write(寫入):把store傳入來的變數放在主記憶體的變數裡。

  4.記憶體互動操作的規則  

       1.read和load,store和write必須順序執行,不一定連續執行。

       2.工作記憶體assign了,值改變了,不能不同步會主記憶體

    3.沒有assign不能返回主記憶體.

    4.實施use,store之前,要執行assign,和load

    5.一個變數同一時刻只能允許一條執行緒對其進行lock操作,但是lock可以被同一條執行緒執行多次。

    6.如果對一個變數進行lock,那麼就清空工作記憶體的值,執行引擎要使用時要重新load和assign(load和assign會引起變數的更新)。

    7.變數沒有被lock,不能執行unlock。

    8.執行unlock,要先store和write同步變量回主記憶體。