Atomic原子操作和volatile非原子性

首先碑诉,我們要理解什么叫原子操作常遂,原子操作可以理解為:在多線程操作同一對(duì)象時(shí)纳令,在非程序代碼加鎖狀況下,保證被操作對(duì)象是結(jié)果是符合預(yù)期的克胳。

翻譯為人話就是:一個(gè)數(shù)泊碑,很多線程去同時(shí)修改它,不加sync同步鎖毯欣,就可以保證修改結(jié)果是正確的馒过。

那它是如何保證的呢?我們先了解一個(gè)叫CAS的東西:

CAS(Compare and swap):比較和替換是設(shè)計(jì)并發(fā)算法時(shí)用到的一種技術(shù)酗钞。簡(jiǎn)單來(lái)說(shuō)腹忽,比較和替換是使用一個(gè)期望值和一個(gè)變量的當(dāng)前值進(jìn)行比較来累,如果當(dāng)前變量的值與我們期望的值相等,就使用一個(gè)新值替換當(dāng)前變量的值窘奏。CAS是一種系統(tǒng)原語(yǔ)(所謂原語(yǔ)屬于操作系統(tǒng)用語(yǔ)范疇嘹锁。原語(yǔ)由若干條指令組成的,用于完成一定功能的一個(gè)過程着裹。primitive or atomic action 是由若干個(gè)機(jī)器指令構(gòu)成的完成某種特定功能的一段程序领猾,具有不可分割性·即原語(yǔ)的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷)骇扇。CAS是Compare And Set的縮寫摔竿。CAS有3個(gè)操作數(shù),內(nèi)存值V少孝,舊的預(yù)期值A(chǔ)继低,要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí)稍走,將內(nèi)存值V修改為B袁翁,否則什么都不做。

可以說(shuō)婿脸,原子操作正是靠CAS算法保證的粱胜。可能有人會(huì)有疑問:CAS是比較替換算法狐树,會(huì)不會(huì)同時(shí)有兩個(gè)線程同時(shí)比較且同時(shí)替換年柠?答案當(dāng)然是:不會(huì)。

為什么不會(huì)褪迟?我們來(lái)看一下紅色字體的內(nèi)容,前方高能答憔,需要操作系統(tǒng)的知識(shí):

1味赃、原語(yǔ)由若干條指令組成的,用于完成一定功能的一個(gè)過程虐拓。

2心俗、即原語(yǔ)的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷蓉驹。

在x86 平臺(tái)上城榛,CPU提供了在指令執(zhí)行期間對(duì)總線加鎖的手段。CPU芯片上有一條引線#HLOCK pin态兴,如果匯編語(yǔ)言的程序中在一條指令前面加上前綴'LOCK'狠持,經(jīng)過匯編以后的機(jī)器代碼就使CPU在執(zhí)行這條指令的時(shí)候把#HLOCK pin的電位拉低,持續(xù)到這條指令結(jié)束時(shí)放開瞻润,從而把總線鎖住喘垂,這樣同一總線上別的CPU就暫時(shí)不能通過總線訪問內(nèi)存了甜刻,保證了這條指令在多處理器環(huán)境中的原子性。

所以正勒,不會(huì)存在兩個(gè)線程同時(shí)比較得院、同時(shí)替換。另外章贞,因?yàn)镃AS是基于樂觀鎖的祥绞,也就是說(shuō)當(dāng)寫入的時(shí)候,如果寄存器舊值已經(jīng)不等于現(xiàn)值鸭限,說(shuō)明有其他CPU在修改蜕径,那就繼續(xù)嘗試。所以這就保證了操作的原子性里覆。因此在大請(qǐng)求量的性能表現(xiàn)上丧荐,CAS樂觀鎖也是可以大大提高吞吐量的。

Atomic正是采用了CAS算法喧枷,所以可以在多線程環(huán)境下安全地操作對(duì)象虹统。

總之,原子操作的基石是:CPU對(duì)總線加鎖隧甚,加鎖的方式叫:拉低電位(一串0101010100101呼嘯而過)车荔。

然而,volatile是Java的關(guān)鍵字戚扳,官方解釋:volatile可以保證可見性忧便、順序性、一致性帽借。

下面解讀一下:

可見性:volatile修飾的對(duì)象在加載時(shí)會(huì)告知JVM珠增,對(duì)象在CPU的緩存上對(duì)多個(gè)線程是同時(shí)可見的。

順序性:這里有JVM的內(nèi)存屏障的概念砍艾,簡(jiǎn)單理解為:可以保證線程操作對(duì)象時(shí)是順序執(zhí)行的蒂教,詳細(xì)了解可以自行查閱。

一致性:可以保證多個(gè)線程讀取數(shù)據(jù)時(shí)脆荷,讀取到的數(shù)據(jù)是最新的凝垛。(注意讀取的是最新的數(shù)據(jù),但不保證寫回時(shí)不會(huì)覆蓋其他線程修改的結(jié)果)

基于上面的信息蜓谋,大概可以初步了解volatile多線程下非原子性了梦皮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桃焕,隨后出現(xiàn)的幾起案子剑肯,更是在濱河造成了極大的恐慌,老刑警劉巖观堂,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件退子,死亡現(xiàn)場(chǎng)離奇詭異岖妄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寂祥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門荐虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人丸凭,你說(shuō)我怎么就攤上這事福扬。” “怎么了惜犀?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵铛碑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我虽界,道長(zhǎng)汽烦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任莉御,我火速辦了婚禮撇吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘礁叔。我一直安慰自己帝火,他們只是感情好润匙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布然痊。 她就那樣靜靜地躺著哗伯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涣易。 梳的紋絲不亂的頭發(fā)上画机,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音新症,去河邊找鬼步氏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛账劲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播金抡,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瀑焦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梗肝?” 一聲冷哼從身側(cè)響起榛瓮,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巫击,沒想到半個(gè)月后禀晓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體精续,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年粹懒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了重付。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凫乖,死狀恐怖确垫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帽芽,我是刑警寧澤删掀,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站导街,受9級(jí)特大地震影響披泪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搬瑰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一款票、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跌捆,春花似錦徽职、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至抄瓦,卻和暖如春潮瓶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钙姊。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工毯辅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煞额。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓思恐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膊毁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胀莹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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

  • Java8張圖 11、字符串不變性 12婚温、equals()方法描焰、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,709評(píng)論 0 11
  • CAS簡(jiǎn)歷 CAS(Compare and swap)比較和替換是設(shè)計(jì)并發(fā)算法時(shí)用到的一種技術(shù) 栅螟。Compare ...
    classtag閱讀 4,155評(píng)論 2 37
  • 此文章出自:<a href="http://www.cnblogs.com/dolphin0520/p/39203...
    zlb閱讀 635評(píng)論 0 6
  • 看著鏡子里自己的肚子又大了一圈荆秦,于是我決定減肥±榻撸現(xiàn)在的我餓著肚子在碼字,可是并不知道要碼些什么步绸。 自從畢業(yè)以后掺逼,志...
    如大機(jī)智閱讀 323評(píng)論 0 0
  • 01 最近《三生三世十里桃花》火得不要不要的惑朦,劇情本就不錯(cuò)兽泄,各位小仙演技也基本在線,所以我也一路追著漾月,一集沒落病梢。 ...
    學(xué)徒賢芳閱讀 3,687評(píng)論 0 8