volatile關(guān)鍵字

一叹谁、是什么

? ? volatile是Java提供的一種輕量級(jí)的同步機(jī)制。Java語言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)volatile變量期吓,相比于synchronized早歇,它更為輕量級(jí),因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度。但是volatile變量的同步性較差箭跳,而且其使用也更容易出錯(cuò)晨另。

二、并發(fā)編程的三個(gè)概念

????1. 原子性:即一個(gè)操作或者多個(gè)操作谱姓,要么全部執(zhí)行并且執(zhí)行的過程不會(huì)被任何因素打斷借尿,要么就都不執(zhí)行。

Java中的原子性操作包括:

a. 基本類型的讀取和賦值操作屉来,且賦值必須是數(shù)字賦值給變量路翻,變量之間的相互賦值不是原子性操作。

b.所有引用reference的賦值操作

c.java.concurrent.Atomic.* 包中所有類的一切操作

? ? 2.可見性:指當(dāng)多個(gè)線程訪問同一個(gè)變量時(shí)奶躯,一個(gè)線程修改了這個(gè)變量值帚桩,其他線程能夠立即看得到修改的值。

Java提供了volatile來保證可見性嘹黔,當(dāng)一個(gè)線程修改共享變量后,他會(huì)立即被更新到主內(nèi)存中莫瞬,其他線程讀取共享變量時(shí)儡蔓,會(huì)直接從主內(nèi)存中讀取。

synchronizeLock都可以保證可見性疼邀。synchronized和Lock能保證同一時(shí)刻只有一個(gè)線程獲取鎖然后執(zhí)行同步代碼喂江,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到主存當(dāng)中。因此可以保證可見性旁振。

? ? 3.有序性:即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行

Java內(nèi)存模型中的有序性可以總結(jié)為:如果在本線程內(nèi)觀察获询,所有操作都是有序的;如果在一個(gè)線程中觀察另一個(gè)線程拐袜,所有操作都是無序的吉嚣。前半句是指“線程內(nèi)表現(xiàn)為串行語義”,后半句是指“指令重排序”現(xiàn)象和“工作內(nèi)存主主內(nèi)存同步延遲”現(xiàn)象蹬铺。

三尝哆、鎖的互斥性和可見性

????鎖提供了兩種特性:互斥(mutual exclusion) 和可見性(visibility)。

互斥:一次只允許一個(gè)線程持有某個(gè)特定的值甜攀,一次只有一個(gè)線程能使用該共享數(shù)據(jù)秋泄。 可見性:當(dāng)一條線程修改了共享變量的值,新值對(duì)于其他線程來說是可以立即得知的规阀。

四恒序、Java內(nèi)存模型

????之前已經(jīng)寫過了,參考:http://www.reibang.com/p/0c4632c0f849

五谁撼、volatile變量的特性

? ? (1)保證可見性歧胁,不保證原子性

? ? ? ? a. 當(dāng)寫一個(gè)volatile變量時(shí),JMM會(huì)把該線程本地內(nèi)存中的變量強(qiáng)制刷新到主內(nèi)存中;

? ? ? ? b. 這個(gè)寫操作會(huì)導(dǎo)致其他線程中的緩存無效与帆。

? ? (2)禁止指令重排

? ? ? ? 指令重排是指編譯器和處理器為了優(yōu)化程序性能而對(duì)指令序列進(jìn)行排序的一種手段了赌。使用volatile關(guān)鍵字修飾共享變量便可以禁止這種重排序。若用volatile修飾共享變量玄糟,在編譯時(shí)勿她,會(huì)在指令序列中插入內(nèi)存屏障來禁止特定類型的處理器重排序。

? ? (3)volatile不適用于復(fù)合操作阵翎,只適用于原子操作逢并。涉及到復(fù)合操作的線程安全問題要使用synchronized或者lock處理。

六郭卫、volatile原理? ? ? ?

? ? volatile可以保證線程可見性且提供了一定的有序性砍聊,但是無法保證原子性。在JVM底層volatile是采用“內(nèi)存屏障”來實(shí)現(xiàn)的贰军。加入了volatile關(guān)鍵字后的匯編代碼會(huì)多出一個(gè)lock前綴指令玻蝌,實(shí)際上相當(dāng)于一個(gè)內(nèi)存屏障,它會(huì)做以下三個(gè)步驟:

? ? 1. 確保指令重排時(shí)不會(huì)將其后面的指令排到內(nèi)存屏障之前的位置词疼,也不會(huì)把前面的指令排到內(nèi)存屏障的后面俯树;即在執(zhí)行到內(nèi)存屏障這句指令時(shí),在它前面的操作已經(jīng)全部完成贰盗;

? ? 2. 它會(huì)強(qiáng)制將對(duì)緩存的修改操作立即寫入主庫许饿;

? ? 3. 如果是寫操作,她會(huì)導(dǎo)致其他CPU中對(duì)應(yīng)的緩存行無效舵盈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陋率,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秽晚,更是在濱河造成了極大的恐慌瓦糟,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆惧,死亡現(xiàn)場離奇詭異狸页,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扯再,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門芍耘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熄阻,你說我怎么就攤上這事斋竞。” “怎么了秃殉?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵坝初,是天一觀的道長浸剩。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任篓吁,我火速辦了婚禮救巷,結(jié)果婚禮上萍桌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布剿配。 她就那樣靜靜地躺著,像睡著了一般阅束。 火紅的嫁衣襯著肌膚如雪呼胚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天息裸,我揣著相機(jī)與錄音蝇更,去河邊找鬼。 笑死界牡,一個(gè)胖子當(dāng)著我的面吹牛簿寂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宿亡,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼纳令!你這毒婦竟也來了挽荠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤平绩,失蹤者是張志新(化名)和其女友劉穎圈匆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏雌,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跃赚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了性湿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纬傲。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肤频,靈堂內(nèi)的尸體忽然破棺而出叹括,到底是詐尸還是另有隱情,我是刑警寧澤宵荒,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布汁雷,位于F島的核電站净嘀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侠讯。R本人自食惡果不足惜挖藏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢漩。 院中可真熱鬧膜眠,春花似錦、人聲如沸袁翁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粱胜。三九已至柄驻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焙压,已是汗流浹背鸿脓。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯曲,地道東北人野哭。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像幻件,于是被迫代替她去往敵國和親拨黔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351