volatile關(guān)鍵字

先來一點(diǎn)鋪墊

先看看內(nèi)存模型的概念

cpu經(jīng)常會讀取和寫入數(shù)據(jù)负懦,但是cpu的運(yùn)算速度很快,但是從主存讀寫數(shù)據(jù)的速度遠(yuǎn)遠(yuǎn)比不上cpu的
讀寫速度仙逻。所以中間就添加了一個高速緩存瞧捌。主存把數(shù)據(jù)放到高速緩存中折联,cpu從高速緩存中讀取涕癣,然后返回
給高速緩存彬祖。高速緩存再寫入主存

如何解決多線程共享數(shù)據(jù)不一致

多線程訪問共享數(shù)據(jù)如果沒有一些手段仿贬,將會出問題如臟讀纽竣。。
兩種解決方案:加鎖茧泪。緩存一致性
加鎖:在cpu讀取內(nèi)存時蜓氨。系統(tǒng)鎖住該線程,并且不準(zhǔn)其他cpu讀取數(shù)據(jù)调炬。直到該操作完成為止
緩存一致性:當(dāng)cpu發(fā)現(xiàn)操作的變量是共享變量(其他cpu中存在副本)语盈。就發(fā)出信號通知其他cpu將
該變量的緩存行設(shè)置為無效

[圖片上傳失敗...(image-fdc73c-1518589180914)]

并發(fā)編程的三問題

原子性問題
可見性問題
有序性問題:處理器并不會按照順序加載代碼(如果兩行代碼沒有依賴性)$峙荩可能會重排序刀荒,但是處理器會保證運(yùn)算結(jié)果和初始順序結(jié)果一樣
在單線程情況下是沒問題的。但是在多線程情況下就有問題了棘钞。

java內(nèi)存模型解決三問題

原子性問題:對基本數(shù)據(jù)的讀取和賦值是原子操作缠借,更多的可用synchronized和lock
可見性問題:volatile關(guān)鍵字。被volatile關(guān)鍵字修飾的變量更新后將會馬上更新到主存宜猜。其他
線程會去讀新值泼返。synchronized和lock也能保證
有序性問題:volatile能保證一點(diǎn)有序性。synchronized和lock保證有序性
            happen-before原則姨拥。不能遵從happen-before绅喉,虛擬機(jī)就可以對他們隨意排序
            
 happen-before原則
 1.程序順序原則。前一個操作結(jié)果對后一個操作是可見的叫乌。
 2.鎖定規(guī)則:同一個鎖的解鎖 happen-before 同一個鎖的加鎖操作
 3.volatile規(guī)則:一個變量的寫發(fā)生在寫之前
 4.傳遞規(guī)則:a發(fā)生在b前柴罐,b發(fā)生在c前,則a發(fā)生在c前
 5.線程啟動規(guī)則:Thread對象的start()方法先行發(fā)生于此線程的每個一個動作
 6.線程中斷規(guī)則:對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測到中斷事件的發(fā)生
 7.線程終結(jié)規(guī)則:線程中所有的操作都先行發(fā)生于線程的終止檢測憨奸,我們可以通過Thread.join()方法結(jié)束革屠、Thread.isAlive()的返回值手段檢測到線程已經(jīng)終止執(zhí)行
 8.對象終結(jié)規(guī)則:一個對象的初始化完成先行發(fā)生于他的finalize()方法的開始

volatile的兩層語義

1)保證了不同線程對這個變量進(jìn)行操作時的可見性,即一個線程修改了某個變量的值排宰,這新值對其他線程來說是立即可見的似芝。
  
2)禁止進(jìn)行指令重排序。

volatile不能保證原子性

volatile 會保證線程讀到最新的值板甘。但是是在沒有發(fā)生堵塞的情況下
如果一個自增操作党瓮,在查詢到值后,被堵塞盐类。就變成了查詢操作寞奸,也就不會無效其他cpu的緩存
其他線程就只能讀到臟數(shù)據(jù)

volatile保證一定的有序性

volatile變量保證他前面的操作都已經(jīng)進(jìn)行痕寓,后面肯定沒有進(jìn)行

volatile的原理

加入volatile的代碼會生成一個lock前綴
lock前綴指令實(shí)際上相當(dāng)于一個內(nèi)存屏障(也成內(nèi)存柵欄),內(nèi)存屏障會提供3個功能:

  1)它確保指令重排序時不會把其后面的指令排到內(nèi)存屏障之前的位置蝇闭,也不會把前面的指令排到內(nèi)存屏障的后面;即在執(zhí)行到內(nèi)存屏障這句指令時硬毕,在它前面的操作已經(jīng)全部完成呻引;

  2)它會強(qiáng)制將對緩存的修改操作立即寫入主存;

  3)如果是寫操作吐咳,它會導(dǎo)致其他CPU中對應(yīng)的緩存行無效逻悠。    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市韭脊,隨后出現(xiàn)的幾起案子童谒,更是在濱河造成了極大的恐慌,老刑警劉巖沪羔,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饥伊,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔫饰,警方通過查閱死者的電腦和手機(jī)琅豆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篓吁,“玉大人茫因,你說我怎么就攤上這事≌燃簦” “怎么了冻押?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盛嘿。 經(jīng)常有香客問我洛巢,道長,這世上最難降的妖魔是什么孩擂? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任狼渊,我火速辦了婚禮,結(jié)果婚禮上类垦,老公的妹妹穿的比我還像新娘狈邑。我一直安慰自己,他們只是感情好蚤认,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布米苹。 她就那樣靜靜地躺著,像睡著了一般砰琢。 火紅的嫁衣襯著肌膚如雪蘸嘶。 梳的紋絲不亂的頭發(fā)上良瞧,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音训唱,去河邊找鬼褥蚯。 笑死,一個胖子當(dāng)著我的面吹牛况增,可吹牛的內(nèi)容都是我干的赞庶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼澳骤,長吁一口氣:“原來是場噩夢啊……” “哼歧强!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起为肮,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摊册,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颊艳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茅特,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年籽暇,在試婚紗的時候發(fā)現(xiàn)自己被綠了温治。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡戒悠,死狀恐怖熬荆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绸狐,我是刑警寧澤卤恳,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寒矿,受9級特大地震影響突琳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜符相,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一拆融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啊终,春花似錦镜豹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至例衍,卻和暖如春昔期,著一層夾襖步出監(jiān)牢的瞬間已卸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工硼一, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留累澡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓般贼,卻偏偏與公主長得像永乌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子具伍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容