Java 并發(fā)——volatile

JVM內(nèi)存管理

概述

volatile 是輕量級(jí)的 synchronized注整。volatile 作用于共享變量郭膛,具備了“鎖”的特性,這是為了確保共享變量能被準(zhǔn)確和一致性地更新斧账,這是 volatile 的可見性著蟹。同時(shí),它也閹割了 scnchronized 的一寫功能中贝,比如:原子性囤捻。

內(nèi)存模型

圖如篇首。

首先我們應(yīng)該明白CPU是執(zhí)行命令的場(chǎng)所邻寿,當(dāng)需要處理數(shù)據(jù)時(shí)蝎土,CPU會(huì)從主內(nèi)存(計(jì)算機(jī)內(nèi)存)中取值,這樣很慢绣否。后來有了CPU高速緩存(cache)誊涯,也就是CPU上有一小塊存儲(chǔ)空間緩存了從主內(nèi)存中獲取的數(shù)據(jù),CPU直接讀取cache枝秤,效率大增。

然后慷嗜,問題出現(xiàn)了淀弹,待處理的數(shù)據(jù)并非是主內(nèi)存中的原型,而是一個(gè)副本庆械,在多線程場(chǎng)景下薇溃,這個(gè)副本的處理結(jié)果很有可能會(huì)失控。這個(gè)問題也就是緩存一致性問題缭乘,即cache和主內(nèi)存數(shù)據(jù)同步問題沐序。目前我知道解決緩存一致性問題有兩種方案:

通過在總線加LOCK鎖

通過緩存一致性協(xié)議

第一種是通過獨(dú)占CPU方式實(shí)現(xiàn),同一時(shí)間只有一個(gè)CPU在運(yùn)行堕绩,效率低下策幼。

第二種允許多核處理,并且讓共享副本在線程之間具有可見性奴紧。

可見性

通過 volatile 實(shí)現(xiàn)了緩存一致性特姐,其工作原理如下:

當(dāng)某個(gè)CPU在寫數(shù)據(jù)時(shí),如果發(fā)現(xiàn)操作的變量是共享變量黍氮,則會(huì)通知其他CPU告知該變量的緩存行是無(wú)效的唐含,因此其他CPU在讀取該變量時(shí),發(fā)現(xiàn)其無(wú)效會(huì)重新從主存中加載數(shù)據(jù)沫浆。

  volatile 的可見性只針對(duì)當(dāng)CPU從主內(nèi)存中加載共享變量的時(shí)候捷枯。但是當(dāng)線程A、B同時(shí)加載了共享變量i专执,后者說線程A先加載了i淮捆,在A將i寫入之前,B加載了i,B加載的i仍然是主內(nèi)存中i的初始值争剿。

非原子性

線程內(nèi)存與主內(nèi)存的交互過程如下:

主要有以下5項(xiàng)操作:

read:從主內(nèi)存中讀取變量

load:復(fù)制變量到線程本地內(nèi)存作為副本

use:運(yùn)算副本

assign:給副本賦值

store:副本寫入線程本地內(nèi)存?直播系統(tǒng)開發(fā)找上海捌躍網(wǎng)絡(luò)科技有限公司?17621291122

write:線程內(nèi)存中的共享副本刷新主內(nèi)存中的共享變量

上一章節(jié)——“可見性”中已經(jīng)聲明 volatile 的可見性只針對(duì)當(dāng)CPU從主內(nèi)存中加載共享變量的時(shí)候已艰,即load之前,一旦load蚕苇,無(wú)論主內(nèi)存中的共享變量發(fā)生了什么哩掺,副本的值不會(huì)被主內(nèi)存同步。也就是說涩笤,volatile不具有原子性嚼吞。

  網(wǎng)友解答:

volatile的非原子性:線程工作內(nèi)容中的值從主內(nèi)存中直接加載,一旦加載完成蹬碧,就不會(huì)再產(chǎn)生對(duì)應(yīng)的變化舱禽。JVM保證的是從主內(nèi)存中加載到線程工作內(nèi)存中的值是最新的,但是無(wú)法保證原子性恩沽。 volatile解決的是變量讀時(shí)的可見性問題誊稚,無(wú)法保證原子性。

package com.zhoupq.multiThread.Volatile;

public class VolatileDemo implements Runnable

{

static volatile int i = 1;br/>@Override

public void run()

{

System.out.println(Thread.currentThread().getName() + ": " + i + ", "

(++i));

}

public static void main(String[] args)

{

Thread t1 = new Thread(new VolatileDemo(), "A");

Thread t2 = new Thread(new VolatileDemo(), "B");

Thread t3 = new Thread(new VolatileDemo(), "C");

Thread t4 = new Thread(new VolatileDemo(), "D");

t1.start();

t2.start();

t3.start();

t4.start();

}

}

/

A: 1, 2

B: 1, 3

C: 3, 4

D: 4, 5

/

結(jié)果與預(yù)期不符罗心,在預(yù)期的結(jié)果中里伯,線程B應(yīng)該加載的i是2,運(yùn)算之后變成3渤闷。由此我們知道疾瓮,volatile 不能解決并發(fā)計(jì)算問題。

  網(wǎng)友解答:

i 和+(++i)是兩條指令飒箭,會(huì)發(fā)生這種情況:

假設(shè)當(dāng)前i為1狼电,線程A執(zhí)行+i,線程B執(zhí)行+i弦蹂,然后線程A執(zhí)行+(++i)肩碟,這時(shí)i=2,然后線程B執(zhí)行+(++i)凸椿,這時(shí)i=3腾务,線程A輸出(1, 2),線程B輸出(1, 3)削饵。

小結(jié)

volatile 保證可見性

volatile 不保證原子性

volatile 不能解決并發(fā)計(jì)算問題

轉(zhuǎn)自:http://blog.51cto.com/13917525/2320095

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩瘦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窿撬,更是在濱河造成了極大的恐慌启昧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劈伴,死亡現(xiàn)場(chǎng)離奇詭異密末,居然都是意外死亡握爷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門严里,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新啼,“玉大人,你說我怎么就攤上這事刹碾≡镒玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵迷帜,是天一觀的道長(zhǎng)物舒。 經(jīng)常有香客問我,道長(zhǎng)戏锹,這世上最難降的妖魔是什么冠胯? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锦针,結(jié)果婚禮上荠察,老公的妹妹穿的比我還像新娘。我一直安慰自己奈搜,他們只是感情好悉盆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媚污,像睡著了一般舀瓢。 火紅的嫁衣襯著肌膚如雪廷雅。 梳的紋絲不亂的頭發(fā)上耗美,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音航缀,去河邊找鬼商架。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痢法,可吹牛的內(nèi)容都是我干的奥溺。 我是一名探鬼主播匿值,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赶袄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抠藕,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饿肺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盾似,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敬辣,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溉跃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片村刨。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撰茎,靈堂內(nèi)的尸體忽然破棺而出嵌牺,到底是詐尸還是另有隱情,我是刑警寧澤乾吻,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布髓梅,位于F島的核電站,受9級(jí)特大地震影響绎签,放射性物質(zhì)發(fā)生泄漏枯饿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一诡必、第九天 我趴在偏房一處隱蔽的房頂上張望奢方。 院中可真熱鬧,春花似錦爸舒、人聲如沸蟋字。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹊奖。三九已至,卻和暖如春涂炎,著一層夾襖步出監(jiān)牢的瞬間忠聚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工唱捣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留两蟀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓震缭,卻偏偏與公主長(zhǎng)得像赂毯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拣宰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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