探究Java如何實(shí)現(xiàn)原子操作(atomic operation)

1. 讓我們首先了解下java 中 Volatile 關(guān)鍵字

? ? ?Volatile可實(shí)現(xiàn)java內(nèi)存模型當(dāng)中的可見(jiàn)性缀程,

? ? ?java內(nèi)存模型的可見(jiàn)性:

可見(jiàn)性妻坝,是指線程之間的可見(jiàn)性,一個(gè)線程修改的狀態(tài)對(duì)另一個(gè)線程是可見(jiàn)的铣鹏。也就是一個(gè)線程修改的結(jié)果敷扫,另一個(gè)線程馬上就能看到。

比如:用volatile修飾的變量诚卸,就會(huì)具有可見(jiàn)性葵第。volatile修飾的變量不允許線程內(nèi)部緩存和重排序,即直接修改內(nèi)存合溺。所以對(duì)其他線程是可見(jiàn)的卒密。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BUT

Volatile 不保證原子性:

?just like this:

? volatile int a=0; a 具有可見(jiàn)性 但是如下操作仍然不具有原子性 a++;

讓我們看看什么是原子操作 什么是非原子操作:

原子操作:a=0棠赛;

非原子操作 a++哮奇,即a=a+1;

那么在java 中 如何保證原子性呢睛约?方法是 sync 屏镊,lock,unlock


2 .那么volatile的實(shí)現(xiàn)原理是什么痰腮?

? ? 先這樣理解:

? ? ?把對(duì)volatile變量的單個(gè)讀/寫(xiě)而芥,看成是使用同一個(gè)鎖對(duì)這些單個(gè)讀/寫(xiě)操作 ? ? 做了同步。示例:

? ? ? ? ? ? ?

示例程序

下面的程序等價(jià)于上面的示例程序


等價(jià)程序

volatile的特性:

? (1) 對(duì)一個(gè)volatile變量的單個(gè)讀/寫(xiě)操作膀值,與對(duì)一個(gè)普通變量的讀/寫(xiě)操作使用同一個(gè)鎖來(lái)同步棍丐,它們之間的執(zhí)行效果相同。

可見(jiàn)性:對(duì)一個(gè)volatile變量的讀沧踏,總是能看到(任意線程)對(duì)這個(gè)volatile變量最后的寫(xiě)入歌逢。

原子性:對(duì)任意單個(gè)volatile變量的讀/寫(xiě)具有原子性,但類似于volatile++這種復(fù)合操作不具有原子性翘狱。


3:來(lái)談?wù)?------鎖

? ? ? 3.1:釋放鎖和獲取鎖的內(nèi)存語(yǔ)義

? 當(dāng)線程釋放鎖時(shí)秘案,JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中,示例代碼如下:


code

假設(shè)線程A執(zhí)行writer()方法,隨后線程B執(zhí)行reader()方法潦匈。

整個(gè)的執(zhí)行過(guò)程如下:threadA(1->2->3)->threadB(4->5->6)

根據(jù)happen-before原則:3執(zhí)行前的所有A線程的操作在3執(zhí)行成功后對(duì)4以后的流程立即可見(jiàn)

鎖釋放和鎖獲取的內(nèi)存意義:當(dāng)線程釋放鎖時(shí)阱高,JMM會(huì)把該線程對(duì)應(yīng)的本地內(nèi)存中的變量刷新到主內(nèi)存中。

當(dāng)線程獲取共享變量時(shí)茬缩,會(huì)把本地內(nèi)存中的變量設(shè)置為無(wú)效赤惊,

從而使得被監(jiān)控的臨界區(qū)中的代碼必須去主內(nèi)存中去讀取共享變量。


4:那就來(lái)看看 atomic operation凰锡,原子操作不需要sync:













最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末未舟,一起剝皮案震驚了整個(gè)濱河市圈暗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕膀,老刑警劉巖员串,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昼扛,居然都是意外死亡寸齐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)野揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)访忿,“玉大人瞧栗,你說(shuō)我怎么就攤上這事斯稳。” “怎么了迹恐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵挣惰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我殴边,道長(zhǎng)憎茂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任锤岸,我火速辦了婚禮竖幔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘是偷。我一直安慰自己拳氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蛋铆。 她就那樣靜靜地躺著馋评,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刺啦。 梳的紋絲不亂的頭發(fā)上留特,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音玛瘸,去河邊找鬼蜕青。 笑死糊渊,一個(gè)胖子當(dāng)著我的面吹牛市咆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播再来,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蒙兰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搜变!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挠他,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殖侵,沒(méi)想到半個(gè)月后贸呢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢军,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年楞陷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉唉。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡固蛾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出度陆,到底是詐尸還是另有隱情艾凯,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布懂傀,位于F島的核電站趾诗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蹬蚁。R本人自食惡果不足惜恃泪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缚忧。 院中可真熱鬧悟泵,春花似錦、人聲如沸闪水。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)球榆。三九已至朽肥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持钉,已是汗流浹背衡招。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留每强,地道東北人始腾。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓州刽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親浪箭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穗椅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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