原子性:原子性是指一個操作是不可分割的论寨,要么全部執(zhí)行星立,要么全部失敗。jvm 定義了以下 8 種操作是具有原子性的(下面的操作都是 jvm 可讀的匯編指令)):
lock(鎖定):作用于主內(nèi)存中的變量葬凳,它把一個變量標(biāo)識為一個線程獨(dú)占的狀態(tài)绰垂;
unlock(解鎖):作用于主內(nèi)存中的變量,它把一個處于鎖定狀態(tài)的變量釋放出來火焰,釋放后的變量才可以被其他線程鎖定
read(讀染⒆啊):作用于主內(nèi)存的變量,它把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便后面的load動作使用占业;
load(載入):作用于工作內(nèi)存中的變量绒怨,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存中的變量副本
use(使用):作用于工作內(nèi)存中的變量,它把工作內(nèi)存中一個變量的值傳遞給執(zhí)行引擎谦疾,每當(dāng)虛擬機(jī)遇到一個需要使用到變量的值的字節(jié)碼指令時將會執(zhí)行這個操作南蹂;
assign(賦值):作用于工作內(nèi)存中的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量念恍,每當(dāng)虛擬機(jī)遇到一個給變量賦值的字節(jié)碼指令時執(zhí)行這個操作六剥;
store(存儲):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個變量的值傳送給主內(nèi)存中以便隨后的write操作使用峰伙;
write(操作):作用于主內(nèi)存的變量疗疟,它把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。
可見性:可見性是指當(dāng)一個線程修改了共享變量之后瞳氓,能夠立馬同步到主存中策彤,其他線程能夠立即得知這個修改。
有序性:計(jì)算機(jī)執(zhí)行程序時并不一定是按照我們編寫的程序由上至下順序執(zhí)行匣摘,編譯器和 CPU 會在保證輸出結(jié)果和順序執(zhí)行一樣的前提下店诗,對指令進(jìn)行重排序,使性能得到優(yōu)化恋沃。如果 CPU 是單核必搞,那這種優(yōu)化不會帶來線程執(zhí)行沖突。但多核 CPU 的情況下囊咏,多線程并發(fā)操作共享變量,這種指令重排序可能導(dǎo)致意想不到的結(jié)果塔橡。