初識Volatile關(guān)鍵字

序言:*牢騷*

? ?相信大家也了解過OKhttp以及AsyncTask源碼搭盾,他們在線程池以及一些共享變量的操作都使用了一個(gè)關(guān)鍵字--》Volatile咳秉,對此我也是一知半解,我們在之前所了解的它是一個(gè)對線程保持可見性的功能定義鸯隅,卻不能深刻了解其含義與使用場景澜建。作為一直在公司忙于項(xiàng)目進(jìn)度的我,也是甚是羞愧滋迈,所以今天也是參考了一些大神的博客了解了一下霎奢。

為什么要使用Volatile關(guān)鍵字?可能有人會(huì)說別人那么用饼灿,照搬嘍幕侠,WTF,其實(shí)很簡單就是為了保證并發(fā)編程的安全性碍彭,那問題又來了晤硕,怎么保證并發(fā)編程訪問共享變量的安全性呢,那么我們就要從Java內(nèi)存模型來了解庇忌。

Java內(nèi)存模型:

1舞箍、所有的變量都存儲(chǔ)在主內(nèi)存中。

2皆疹、不同的線程都有自己的工作內(nèi)存疏橄。

3、不同線程對變量的操作必須在工作內(nèi)存中進(jìn)行略就。

4捎迫、不同線程間無法訪問對方的變量,所有線程間的數(shù)據(jù)傳遞必須在主內(nèi)存中進(jìn)行表牢。


舉個(gè)簡單的小例子:

線程A

int x = 10;

x=12;

線程B

x++;

y=x;

大家認(rèn)為如果多個(gè)線程操作共享變量x窄绒,線程A和B輸出x和y的值是多少,對A輸出的x=12崔兴,而B輸出的y=10;那這是為什么呢彰导?因?yàn)槎嗑€程操作x的時(shí)候A從主內(nèi)存中Copy了x的值蛔翅,然后執(zhí)行賦值,然而這個(gè)時(shí)候并沒有將數(shù)據(jù)寫入到主內(nèi)存中,B線程重新再主內(nèi)存Copy了一份原始值接著進(jìn)行賦值操作位谋,在這里只有int x =10是具有原子性山析,就是基本數(shù)據(jù)直接賦值的屬于原子性操作,變量賦值變量就不具備原子性倔幼。基于此種內(nèi)存模型盖腿,便產(chǎn)生了多線程中的數(shù)據(jù)“臟讀”問題。這也是著名的緩存一致性問題又稱為共享變量损同。

如何保證共享變量安全性呢翩腐,這里就涉及到了并發(fā)編程的三大概念:原子性、有序性膏燃、可見性茂卦。

原子性:一個(gè)或多個(gè)操作,要么全部成功组哩,要么全部失敗等龙,類似于我們數(shù)據(jù)庫事務(wù)

可見性:多個(gè)線程訪問一個(gè)共享變量,當(dāng)一個(gè)線程訪問這個(gè)變量時(shí)伶贰,其他的線程應(yīng)該是立刻能得知這個(gè)變量最新修改的值蛛砰。

? ? ? ①由于可見性對共享變量帶來的數(shù)據(jù)安全問題,Java官方也推薦使用Volatile修飾共享變量,保證被修改的值能立即刷新到主內(nèi)存黍衙。

? ? ? ? 需要注意的是:普通變量 無法保證可見性

有序性:

? ? ?指令重排序泥畅??什么鬼琅翻,不要慌位仁,其實(shí)就是系統(tǒng)為了優(yōu)化代碼而進(jìn)行的順序排序

? ? ? 定義:處理器為了提高程序運(yùn)行效率,可能會(huì)對輸入代碼進(jìn)行優(yōu)化方椎,它不保證程序中各個(gè)語句的執(zhí)行先后順序同代碼中的順序一致聂抢,但是他會(huì)保證最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果是一致的。

核心:處理器在進(jìn)行重哦愛須是會(huì)考慮指令之間的數(shù)據(jù)依賴性棠众。

指令重排序不會(huì)影響單個(gè)線程的執(zhí)行琳疏,但是會(huì)影響并發(fā)線程執(zhí)行的正確性。

并發(fā)線程必須保證原子性闸拿,可見性以及有序性轿亮。還要保證happens-before原則(先行發(fā)生原則)大家可以自己去了解一下,很簡單的胸墙。

延伸:Volatile、Synchronized和ReentrantLock

Synchronized:同步代碼塊和同步方法《Synchronized的用法

ReentrantLock:是一個(gè)接口

viod lock():線程執(zhí)行此方法按咒,如果鎖空閑迟隅,當(dāng)前線程就會(huì)獲取鎖但骨,反之就會(huì)禁用該線程一直處于等待狀態(tài),直到鎖釋放智袭。

void tryLock():只是嘗試獲取鎖奔缠,并不會(huì)導(dǎo)致當(dāng)前線程被禁用。

void unLock():必須由持有者釋放吼野,反之如果線程不持有執(zhí)行該方法可能導(dǎo)致異常校哎。

概念:重入鎖與公平鎖

所謂的重入鎖就是自己獲取自己的鎖以后再次獲取自己內(nèi)部的鎖。

公平鎖就是cpu在調(diào)度線程是在等待隊(duì)列里隨機(jī)挑選一個(gè)線程去執(zhí)行瞳步,那么優(yōu)先級低的可能就會(huì)一直無法獲取就會(huì)發(fā)生饑餓現(xiàn)象闷哆。

ReentrantLock通過構(gòu)造器傳入true或者false區(qū)分公不公平

Synchronized與ReentrantLock區(qū)別:

Lock是一個(gè)接口,而Synchronized是Java關(guān)鍵字


②Synchronized發(fā)生異常時(shí)會(huì)自動(dòng)釋放線程占有鎖不會(huì)死鎖单起,而lock發(fā)生異常時(shí)抱怔,如果用戶沒有主動(dòng)通過Unlock去釋放鎖,很可能造成死鎖嘀倒。

③lock可以知道有沒有成功獲取鎖屈留,而Synchronized不可以。

Java1.5時(shí)测蘑,Synchronized是性能低耗的灌危,操作都需要轉(zhuǎn)入內(nèi)核去操作。

Java1.6時(shí)碳胳,Synchronized優(yōu)化了大量的性能勇蝙,而官方也提倡在Synchronized能實(shí)現(xiàn)需求下,優(yōu)先使用Synchronized固逗。

最后感謝本文博文作者Ruheng的文章你真的了解Volatile嗎

大家可以參考一下浅蚪,謝謝,輕噴

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烫罩,一起剝皮案震驚了整個(gè)濱河市惜傲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贝攒,老刑警劉巖盗誊,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隘弊,居然都是意外死亡哈踱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門梨熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來开镣,“玉大人,你說我怎么就攤上這事咽扇⌒安疲” “怎么了陕壹?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树埠。 經(jīng)常有香客問我糠馆,道長,這世上最難降的妖魔是什么怎憋? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任又碌,我火速辦了婚禮,結(jié)果婚禮上绊袋,老公的妹妹穿的比我還像新娘毕匀。我一直安慰自己,他們只是感情好愤炸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布期揪。 她就那樣靜靜地躺著,像睡著了一般规个。 火紅的嫁衣襯著肌膚如雪凤薛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天诞仓,我揣著相機(jī)與錄音缤苫,去河邊找鬼。 笑死墅拭,一個(gè)胖子當(dāng)著我的面吹牛活玲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谍婉,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舒憾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穗熬?” 一聲冷哼從身側(cè)響起镀迂,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唤蔗,沒想到半個(gè)月后探遵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妓柜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年箱季,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍掐。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡藏雏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出作煌,到底是詐尸還是另有隱情诉稍,我是刑警寧澤蝠嘉,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站杯巨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏努酸。R本人自食惡果不足惜服爷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获诈。 院中可真熱鬧仍源,春花似錦、人聲如沸舔涎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亡嫌。三九已至嚎于,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挟冠,已是汗流浹背于购。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留知染,地道東北人肋僧。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像控淡,于是被迫代替她去往敵國和親嫌吠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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