本身隨著CPU和內(nèi)存的發(fā)展速度差異的問題,導(dǎo)致CPU的速度遠快于內(nèi)存,所以現(xiàn)在的CPU加?了?速緩存,?速緩存?般可以分為L1、L2、L3三級緩存。基于上?的例?我們知道了這導(dǎo)致了緩存?致性的問題,所以加?了緩存?致性協(xié)議,同時導(dǎo)致了內(nèi)存可?性的問題,?編譯器和CPU的重排序?qū)е铝嗽?性和有序性的問題,JMM內(nèi)存模型正是對多線程操作下的?系列規(guī)范約束,因為不可能讓陳雇員的代碼去兼容所有的CPU,通過JMM我們才屏蔽了不同硬件和操作系統(tǒng)內(nèi)存的訪問差異,這樣保證了Java程序在不同的平臺下達到?致的內(nèi)存訪問效果,同時也是保證在?效并發(fā)的時候程序能夠正確執(zhí)?。

原?性:Java內(nèi)存模型通過read、load、assign、use、store、write來保證原?性操作,此外還有l(wèi)ock和unlock,直接對應(yīng)著synchronized關(guān)鍵字的monitorenter和monitorexit字節(jié)碼指令。
可?性:可?性的問題在上?的回答已經(jīng)說過,Java保證可?性可以認(rèn)為通過volatile、synchronized、final來實現(xiàn)。
有序性:由于處理器和編譯器的重排序?qū)е碌挠行蛐詥栴},Java通過volatile、synchronized來保證。happen-before規(guī)則
雖然指令重排提?了并發(fā)的性能,但是Java虛擬機會對指令重排做出?些規(guī)則限制,并不能讓所有的指令都隨意的改變執(zhí)?位置,主要有以下?點:
1. 單線程每個操作,happen-before于該線程中任意后續(xù)操作
2. volatile寫happen-before與后續(xù)對這個變量的讀
3. synchronized解鎖happen-before后續(xù)對這個鎖的加鎖
4. final變量的寫happen-before于final域?qū)ο蟮淖x,happen-before后續(xù)對final變量的讀
5. 傳遞性規(guī)則,A先于B,B先于C,那么A?定先于C發(fā)?