本身隨著CPU和內(nèi)存的發(fā)展速度差異的問(wèn)題,導(dǎo)致CPU的速度遠(yuǎn)快于內(nèi)存磷蜀,所以現(xiàn)在的CPU加?了?速緩存召耘,?速緩存?般可以分為L(zhǎng)1、L2褐隆、L3三級(jí)緩存污它。基于上?的例?我們知道了這導(dǎo)致了緩存?致性的問(wèn)題,所以加?了緩存?致性協(xié)議衫贬,同時(shí)導(dǎo)致了內(nèi)存可?性的問(wèn)題德澈,?編譯器和CPU的重排序?qū)е铝嗽?性和有序性的問(wèn)題,JMM內(nèi)存模型正是對(duì)多線程操作下的?系列規(guī)范約束固惯,因?yàn)椴豢赡茏岅惞蛦T的代碼去兼容所有的CPU梆造,通過(guò)JMM我們才屏蔽了不同硬件和操作系統(tǒng)內(nèi)存的訪問(wèn)差異,這樣保證了Java程序在不同的平臺(tái)下達(dá)到?致的內(nèi)存訪問(wèn)效果缝呕,同時(shí)也是保證在?效并發(fā)的時(shí)候程序能夠正確執(zhí)?澳窑。
原?性:Java內(nèi)存模型通過(guò)read、load供常、assign摊聋、use、store栈暇、write來(lái)保證原?性操作麻裁,此外還有l(wèi)ock和unlock,直接對(duì)應(yīng)著synchronized關(guān)鍵字的monitorenter和monitorexit字節(jié)碼指令源祈。
可?性:可?性的問(wèn)題在上?的回答已經(jīng)說(shuō)過(guò)煎源,Java保證可?性可以認(rèn)為通過(guò)volatile、synchronized香缺、final來(lái)實(shí)現(xiàn)手销。
有序性:由于處理器和編譯器的重排序?qū)е碌挠行蛐詥?wèn)題,Java通過(guò)volatile图张、synchronized來(lái)保證锋拖。happen-before規(guī)則
雖然指令重排提?了并發(fā)的性能,但是Java虛擬機(jī)會(huì)對(duì)指令重排做出?些規(guī)則限制祸轮,并不能讓所有的指令都隨意的改變執(zhí)?位置兽埃,主要有以下?點(diǎn):
1. 單線程每個(gè)操作,happen-before于該線程中任意后續(xù)操作
2. volatile寫(xiě)happen-before與后續(xù)對(duì)這個(gè)變量的讀
3. synchronized解鎖happen-before后續(xù)對(duì)這個(gè)鎖的加鎖
4. final變量的寫(xiě)happen-before于final域?qū)ο蟮淖x适袜,happen-before后續(xù)對(duì)final變量的讀
5. 傳遞性規(guī)則柄错,A先于B,B先于C苦酱,那么A?定先于C發(fā)?