色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

如何驗(yàn)證volatile保證數(shù)據(jù)的可見性和有序性

如何驗(yàn)證volatile保證數(shù)據(jù)的可見性和有序性?

1、內(nèi)存可見性

首先,要明確一下這個(gè)內(nèi)存的含義,內(nèi)存包括共享主存和高速緩存,Volatile關(guān)鍵字標(biāo)識(shí)的變量,是指CPU從緩存讀取數(shù)據(jù)時(shí),要判斷數(shù)據(jù)是否有效,如果緩存沒有數(shù)據(jù),則再?gòu)闹鞔孀x取,主存就不存在是否有效的說法了。而內(nèi)存一致性協(xié)議也是針對(duì)緩存的協(xié)議。

內(nèi)存可見性意思是:一個(gè)CPU核心對(duì)數(shù)據(jù)的修改,對(duì)其他CPU核心立即可見。

這句話拆開了理解,CPU修改數(shù)據(jù),首先是對(duì)緩存的修改,然后再同步回主存,在同步回主存的時(shí)候,如果其他CPU也緩存了這個(gè)數(shù)據(jù),就會(huì)導(dǎo)致其他CPU緩存上的數(shù)據(jù)失效,這樣,當(dāng)其他CPU再去它的緩存讀取這個(gè)數(shù)據(jù)的時(shí)候,就必須從主存重新獲取。

實(shí)現(xiàn)的原理一般都是基于CPU的MESI協(xié)議,其中E表示獨(dú)占Exclusive,S表示Shared,M表示Modify,I表示Invalid,如果一個(gè)核心修改了數(shù)據(jù),那么這個(gè)核心的數(shù)據(jù)狀態(tài)就會(huì)更新成M,同時(shí)其他核心上的數(shù)據(jù)狀態(tài)更新成I,這個(gè)是通過CPU多核之間的嗅探機(jī)制實(shí)現(xiàn)的。

但是,這樣是否就能保證多線程操作一個(gè)變量的時(shí)候,結(jié)果如我們預(yù)期呢?其實(shí)不然。

因?yàn)?,Volatile限定的是從緩存讀取時(shí)刻的校驗(yàn),如果兩個(gè)CPU同時(shí)從各自緩存讀取一個(gè)變量n=1(此時(shí),變量n在各個(gè)CPU緩存上都是有效的),并且同時(shí)修改了變量n=n+1,再寫回緩存,這個(gè)時(shí)候n的值等于2,而不是等于3。因此,在多線程操作共享變量(例如:計(jì)數(shù)器)的時(shí)候,正確的方式是使用同步或者Atomic工具類。

2、指令有序性

這個(gè)涉及到內(nèi)存屏障(Memory Barrier),內(nèi)存屏障有兩個(gè)能力:

a、就像一套柵欄分割前后的代碼,阻止柵欄前后的沒有數(shù)據(jù)依賴性的代碼進(jìn)行指令重排序,保證程序在一定程度上的有序性。

b、強(qiáng)制把寫緩沖區(qū)/高速緩存中的臟數(shù)據(jù)等寫回主內(nèi)存,讓緩存中相應(yīng)的數(shù)據(jù)失效,保證數(shù)據(jù)的可見性。

首先,指令并不是代碼行,指令是原子的,通過javap命令可以看到一行代碼編譯出來的指令,當(dāng)然,像int i=1;這樣的代碼行也是原子操作。

在單例模式中,Instance inst = new Instance();

這一句,就不是原子操作,它可以分成三步原子指令:

1,分配內(nèi)存地址;

2,new一個(gè)Instance對(duì)象;

3,將內(nèi)存地址賦值給inst;

CPU為了提高執(zhí)行效率,這三步操作的順序可以是123,也可以是132,如果是132順序的話,當(dāng)把內(nèi)存地址賦給inst后,inst指向的內(nèi)存地址上面還沒有new出來單例對(duì)象,這時(shí)候,如果就拿到inst的話,它其實(shí)就是空的,會(huì)報(bào)空指針異常。這就是為什么單例模式中,單例對(duì)象要加上volatile關(guān)鍵字。

內(nèi)存屏障有三種類型和一種偽類型:

a、lfence:即讀屏障(Load Barrier),在讀指令前插入讀屏障,可以讓高速緩存中的數(shù)據(jù)失效,重新從主內(nèi)存加載數(shù)據(jù),以保證讀取的是最新的數(shù)據(jù)。

b、sfence:即寫屏障(Store Barrier),在寫指令之后插入寫屏障,能讓寫入緩存的最新數(shù)據(jù)寫回到主內(nèi)存,以保證寫入的數(shù)據(jù)立刻對(duì)其他線程可見。

c、mfence,即全能屏障,具備ifence和sfence的能力。

d、Lock前綴:Lock不是一種內(nèi)存屏障,但是它能完成類似全能型內(nèi)存屏障的功能。

---------------------

java 原子類,如何驗(yàn)證volatile保證數(shù)據(jù)的可見性和有序性