shrunk是什么意思 assign是什么意思

思維導圖

shrunk是什么意思 assign是什么意思

文章插圖
面試官:講講什么是JMM
你要是整這個我可就不困了 。
shrunk是什么意思 assign是什么意思

文章插圖
JMM就是Java內存模型(java memory model) 。因為在不同的硬件生產商和不同的操作系統下,內存的訪問有一定的差異,所以會造成相同的代碼運行在不同的系統上會出現各種問題 。所以java內存模型(JMM)屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓java程序在各種平臺下都能達到一致的并發效果 。
Java內存模型規定所有的變量都存儲在主內存中,包括實例變量,靜態變量,但是不包括局部變量和方法參數 。每個線程都有自己的工作內存,線程的工作內存保存了該線程用到的變量和主內存的副本拷貝,線程對變量的操作都在工作內存中進行 。線程不能直接讀寫主內存中的變量 。
不同的線程之間也無法訪問對方工作內存中的變量 。線程之間變量值的傳遞均需要通過主內存來完成 。
如果聽起來抽象的話,我可以畫張圖給你看看,會直觀一點:
shrunk是什么意思 assign是什么意思

文章插圖
每個線程的工作內存都是獨立的,線程操作數據只能在工作內存中進行,然后刷回到主存 。這是 Java 內存模型定義的線程基本工作方式 。
溫馨提醒一下,這里有些人會把Java內存模型誤解為Java內存結構,然后答到堆,棧,GC垃圾回收,最后和面試官想問的問題相差甚遠 。實際上一般問到Java內存模型都是想問多線程,Java并發相關的問題 。
面試官:那JMM定義了什么
這個簡單,整個Java內存模型實際上是圍繞著三個特征建立起來的 。分別是:原子性,可見性,有序性 。這三個特征可謂是整個Java并發的基礎 。
原子性
原子性指的是一個操作是不可分割,不可中斷的,一個線程在執行時不會被其他線程干擾 。
面試官拿筆寫了段代碼,下面這幾句代碼能保證原子性嗎?
int i = 2; int j = i; i++; i = i + 1;第一句是基本類型賦值操作,必定是原子性操作 。
第二句先讀取i的值,再賦值到j,兩步操作,不能保證原子性 。
第三和第四句其實是等效的,先讀取i的值,再+1,最后賦值到i,三步操作了,不能保證原子性 。
JMM只能保證基本的原子性,如果要保證一個代碼塊的原子性,提供了monitorenter 和 moniterexit 兩個字節碼指令,也就是 synchronized 關鍵字 。因此在 synchronized 塊之間的操作都是原子性的 。
可見性
可見性指當一個線程修改共享變量的值,其他線程能夠立即知道被修改了 。Java是利用volatile關鍵字來提供可見性的 。當變量被volatile修飾時,這個變量被修改后會立刻刷新到主內存,當其它線程需要讀取該變量時,會去主內存中讀取新值 。而普通變量則不能保證這一點 。
除了volatile關鍵字之外,final和synchronized也能實現可見性 。
synchronized的原理是,在執行完,進入unlock之前,必須將共享變量同步到主內存中 。
final修飾的字段,一旦初始化完成,如果沒有對象逸出(指對象為初始化完成就可以被別的線程使用),那么對于其他線程都是可見的 。
有序性
在Java中,可以使用synchronized或者volatile保證多線程之間操作的有序性 。實現原理有些區別:
volatile關鍵字是使用內存屏障達到禁止指令重排序,以保證有序性 。
synchronized的原理是,一個線程lock之后,必須unlock后,其他線程才可以重新lock,使得被synchronized包住的代碼塊在多線程之間是串行執行的 。
面試官:給我講一下八種內存交互操作吧
好的,面試官,內存交互操作有8種,我畫張圖給你看吧:
shrunk是什么意思 assign是什么意思

文章插圖
lock(鎖定),作用于主內存中的變量,把變量標識為線程獨占的狀態 。
read(讀取),作用于主內存的變量,把變量的值從主內存傳輸到線程的工作內存中,以便下一步的load操作使用 。
load(加載),作用于工作內存的變量,把read操作主存的變量放入到工作內存的變量副本中 。
use(使用),作用于工作內存的變量,把工作內存中的變量傳輸到執行引擎,每當虛擬機遇到一個需要使用到變量的值的字節碼指令時將會執行這個操作 。
assign(賦值),作用于工作內存的變量,它把一個從執行引擎中接受到的值賦值給工作內存的變量副本中,每當虛擬機遇到一個給變量賦值的字節碼指令時將會執行這個操作 。

推薦閱讀