程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java多線程解讀二(內存篇),java多線程解讀內存

java多線程解讀二(內存篇),java多線程解讀內存

編輯:JAVA綜合教程

java多線程解讀二(內存篇),java多線程解讀內存


線程的內存結構圖

一、主內存與工作內存

1.Java內存模型的主要目標是定義程序中各個變量的訪問規則。此處的變量與Java編程時所說的變量不一樣,指包括了實例字段、靜態字段和構成數組對象的元素,但是不包括局部變量與方法參數,因為它們是線程私有的,不會被共享。

2.Java內存模型中規定了所有的變量都存儲在主內存中,每條線程還有自己的虛擬內存。線程的虛擬內存中保存了該線程使用到的變量到主內存副本拷貝。線程對變量的所有操作(讀取、賦值)都必須在自己的虛擬內存中進行,而不能直接讀寫主內存中的變量。不同線程之間無法直接訪問對方虛擬內存中的變量,線程間變量值的傳遞均需要在主內存來完成。

二、內存間交互操作

關於主內存與工作內存之間的具體交互協議,即一個變量如何從主內存拷貝到工作內存、如何從工作內存同步到主內存之間的實現細節,Java內存模型定義了以下八種操作來完成:

  • lock(鎖定):作用於主內存的變量,把一個變量標識為一條線程獨占狀態。
  • unlock(解鎖):作用於主內存變量,把一個處於鎖定狀態的變量釋放出來,釋放後的變量才可以被其他線程鎖定。
  • read(讀取):作用於主內存變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨後的load動作使用
  • load(載入):作用於工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。
  • use(使用):作用於工作內存的變量,把工作內存中的一個變量值傳遞給執行引擎,每當虛擬機遇到一個需要使用變量的值的字節碼指令時將會執行這個操作。
  • assign(賦值):作用於工作內存的變量,它把一個從執行引擎接收到的值賦值給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。
  • store(存儲):作用於工作內存的變量,把工作內存中的一個變量的值傳送到主內存中,以便隨後的write的操作。
  • write(寫入):作用於主內存的變量,它把store操作從工作內存中一個變量的值傳送到主內存的變量中。

如果要把一個變量從主內存中復制到工作內存,就需要按順尋地執行read和load操作,如果把變量從工作內存中同步回主內存中,就要按順序地執行store和write操作。

三、多線程的三個特性

1、原子性(Atomicity)

原子性是指在一個操作中就是cpu不可以在中途暫停然後再調度,既不被中斷操作,要不執行完成,要不就不執行。和事物的原子性一致。

2、可見性(Visibility)

可見性就是指當一個線程修改了線程共享變量的值,其它線程能夠立即得知這個修改。從多線程內存間的交互我們知道,共享數據都是從主內存拷貝副本在虛擬內存操作,最後寫入主內存,就會造成線程不安全。

如果在變量讀取前從主內存刷新變量值,可以利用這種依賴主內存作為傳遞媒介的方法來實現可見性。

3、有序性(Ordering)

線程的有序性指兩個方面:如果在本線程內觀察,所有操作都是有序的;如果在一個線程中觀察另一個線程,所有操作都是無序的。前半句是指“線程內表現為串行語義”,後半句是指“指令重排序”現象和“工作內存中主內存同步延遲”現象。

四、同步機制

介紹volatile、synchronized、final

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved