Java內存模型

JVM定義了一種內存模型(Java Memory Model)來屏蔽各種硬件和操作系統的內存訪問差異。以實現讓Java在各種平臺下都能達到一致的內存訪問效果。

主內存與工作內存

Java內存模型的主要目標是定義程序中各個變量的訪問規則也就是說在JVM中將變量存儲到內存和從內存讀取變量的底層細節。當然這裏變量(實例字段、靜態字段、數組對象元素),不包括局部變量和方法參數,因爲這兩者是私有的,不會被線程共享。

至於主內存和工作內存,我們看一張圖就可以明白它們之間的關係:
在這裏插入圖片描述

從這張圖中可以看到工作內存和主內存
Java內存模型規定所有的變量都存儲在主內存中,沒有線程都有自己的工作內存,工作內存裏面存的是該線程所用到的變量的主內存副本的拷貝。線程對變量的所有操作都在工作內存中進行,而無法直接訪問主內存。不同的線程之間也無法直接訪問其他線程的工作內存中的變量,線程間變量值的傳遞均需通過主內存來完成。

內存間的交互操作

在上面提到,一個線程無法直接訪問主內存,只能通過工作內存,那麼主內存和工作內存之間如何交互?Java內存模型中定義瞭如下8種操作來完成。JVM實現時必須保證每一種操作都是原子的、不可再分的。

  • lock(鎖定):作用於主內存的變量,把一個變量標識爲一個線程獨佔的變量。
  • unlock(解鎖):作用於主內存的變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量纔可以被其他線程鎖定。
  • read(讀取):作用於主內存的變量,把一個變量從主內存傳輸到線程的工作內存中,以便隨後的load動作使用。
  • load(載入):作用於工作內存的變量,把read操作從主內存中得到的變量值放入工作內存的變量副本中。
  • use(使用):作用於工作內存的變量,把工作內存中的一個變量的值傳遞給執行引擎。
  • assign(賦值):作用於工作內存的變量,把一個從執行引擎接收到的值賦給工作內存的變量。
  • store(存儲):作用於工作內存的變量,把工作內存中一個變量的值傳送到主內存中,以便後續的write操作使用。
  • write(寫入):作用於主內存的變量,把store操作從工作內存中得到的變量的值放入主內存的變量中。

文字挺多,其實剛好是一個整體過程,從主內存讀取,傳送到工作內存,然後工作內存這裏接收,放到相應的位置,在將值傳遞給執行引擎,從執行引擎接收值到工作內存,然後把這個值從工作內存傳送到主內存,最後放到主內存的相應位置。

Java內存模型的三大特性

1.原子性:由java內存模型來直接保證的原子性變量的操作包括:read、load、use、assign、store、write。可以認爲基本數據類型的訪問讀寫是具備原子性的。若需更大範圍的原子性,需要synchronized關鍵字約束。
2.可見性:可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。。volatile、synchronized、final三個關鍵字可以實現可見性。
3.有序性:如果在本線程內觀察,所有操作都是有序的;如果在線程中觀察另外一個線程,所有的操作都是無序的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章