- 定義
程序中各個變量的訪問規(guī)則,在虛擬機中將變量存儲到內存和從內存取出變量這樣的底層細節(jié)。
- 主內存與工作內存
主內存:所有的變量都存在主內存中(虛擬機內存的一部分)
工作內存:每條線程的工作內存中保存了被該線程使用到的變量的主內存副本拷貝線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存中的變量。
- 內存間的交互
虛擬機實現(xiàn)時必須保證下面提及的每一種操作都是原子的,不可再分的
- lock:作用于主內存的變量,它把一個變量標識為一條線程獨占的狀態(tài)
- unlock:作用于主內存的變量,它把一個處于鎖定狀態(tài)的變量釋放出來
- read:作用于主內存的變量,它把一個變量的值從主內存?zhèn)鬏數(shù)骄€程的工作內存中
- load:作用于工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中
- use:作用于工作內存的變量,它把工作內存中一個變量的值傳遞給執(zhí)行引擎,每當虛擬機遇到一個需要使用到變量的值的字節(jié)碼指令時將會執(zhí)行這個操作
- assign:作用于工作內存變量,它把一個從執(zhí)行引擎變量收到的值賦給工作內存的變量,每當虛擬機遇到一個需要給變量復制的字節(jié)碼指令時將會執(zhí)行這個操作
- store:作用于工作內存的變量,它把工作內存中一個變量的值傳送到主內存中,供隨后的 write 使用
- write: 作用于主內存的變量,它把store 操作從工作內存中得到的變量的值放入主內存的變量中。
- volitale 變量
- 保證此變量對所有線程的可見性,也就是說,當一條線程修改了這個變量的值,新值對其他線程都是可以立即得知的
- 禁止指令重排序優(yōu)化
- 原子性,可見性與有序性
原子性:基本數(shù)據(jù)類型的訪問讀寫是具備原子性的
可見性:當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改
有序性:在本線程內觀察,所有的操作都是有序的,如果在一個線程中觀察另一個線程,所有的操作都是無序的
- 先行發(fā)生原則
發(fā)生在Java內存模型中定義的兩項操作之間的偏序關系,如果操作A先行發(fā)生于操作B,其實就是說在發(fā)生操作B之前,操作A產(chǎn)生的影響能被操作B觀察到,影響包括修改了內存中共享變量的值,發(fā)送了信息,調用了方法等