可見性
1lock指令
對volatile修飾的變量,執(zhí)行寫操作的話隧饼,JVM會發(fā)送一條lock前綴指令給CPU沈堡,CPU在計算完之后會立即將這個值寫回主內(nèi)存,同時因為有MESI緩存一致性協(xié)議燕雁,所以各個CPU都會對總線進(jìn)行嗅探诞丽,自己本地緩存中的數(shù)據(jù)是否被別人修改
如果發(fā)現(xiàn)別人修改了某個緩存的數(shù)據(jù)鲸拥,那么CPU就會將自己本地緩存的數(shù)據(jù)過期,然后這個CPU上執(zhí)行的線程在讀取那個變量的時候僧免,就會從主內(nèi)存重新加載最新的數(shù)據(jù)刑赶。
lock前綴指令 + MESI緩存一致性協(xié)議
有效性
(2)內(nèi)存屏障:禁止重排序
底層就是插入了XX內(nèi)存屏障,XX內(nèi)存屏障懂衩,就可以保證指令不會重排
對于volatile修改變量的讀寫操作撞叨,都會加入內(nèi)存屏障
每個volatile寫操作前面,加StoreStore屏障浊洞,禁止上面的普通寫和他重排牵敷;每個volatile寫操作后面,加StoreLoad屏障法希,禁止跟下面的volatile讀/寫重排
每個volatile讀操作后面枷餐,加LoadLoad屏障,禁止下面的普通讀和voaltile讀重排苫亦;每個volatile讀操作后面毛肋,加LoadStore屏障,禁止下面的普通寫和volatile讀重排