并發(fā)學(xué)習(xí)03--Java并發(fā)機(jī)制的底層原理之原子操作的實(shí)現(xiàn)原理

該并發(fā)學(xué)習(xí)系列以閱讀《Java并發(fā)編程的藝術(shù)》一書的筆記為藍(lán)本辽聊,匯集一些閱讀過(guò)程中找到的解惑資料而成。這是一個(gè)邊看邊寫的系列股淡,有興趣的也可以先自行購(gòu)買此書學(xué)習(xí)身隐。

本文首發(fā):windCoder

處理器中的原子操作

原子操作意為:不可中斷的一個(gè)或一系列操作。現(xiàn)在先了解幾個(gè)相關(guān)術(shù)語(yǔ):

術(shù)語(yǔ)名稱 英文 解釋
比較并交換 Compare And Sqap CAS操作需要輸入兩個(gè)數(shù)值唯灵,一個(gè)舊值(期望操作前的值)和一個(gè)新值贾铝,在操作期間先比較舊值有沒(méi)有發(fā)生變化,如果沒(méi)有發(fā)生變化,才交換新值垢揩,發(fā)生了變化則不交換玖绿。
CPU流水線 CPU Pipeline CPU流水線的工作方式就像工業(yè)生產(chǎn)上的裝配流水線,在CPU中由56個(gè)不同功能的電路單元組成一條指令處理流水線叁巨,然后將一條x86指令分成56步后再由這些電路單元分別執(zhí)行斑匪,這樣就能實(shí)現(xiàn)在一個(gè)CPU時(shí)鐘周期完成一條指令,因此提高CPU的運(yùn)算速度锋勺。
內(nèi)存順序周期 Memory Order Violation 內(nèi)存順序沖突一般是由假共享引起的蚀瘸,假共享是指多個(gè)CPU同時(shí)修改同一個(gè)緩存行的不同部分而引起其中一個(gè)CPU的操作無(wú)效,當(dāng)出現(xiàn)這個(gè)內(nèi)存順序沖突時(shí)庶橱,CPU必須清空流水線贮勃。

處理器使用對(duì)緩存加鎖總線加鎖的方式來(lái)實(shí)現(xiàn)多處理器之間的原子操作。

處理器會(huì)自動(dòng)保證基本的內(nèi)存操作的原子性苏章。處理器保證從系統(tǒng)內(nèi)存中讀取或者寫入一個(gè)字節(jié)是原子的寂嘉,即:當(dāng)一個(gè)處理器讀取一個(gè)字節(jié)時(shí),其他處理器不能訪問(wèn)這個(gè)字節(jié)的內(nèi)存地址枫绅。

處理器不能自動(dòng)保證復(fù)雜的內(nèi)存操作的原子性泉孩。如:跨總線寬度、跨多個(gè)緩存行和跨頁(yè)表的訪問(wèn)等復(fù)雜內(nèi)存操作并淋。

處理器提供總線鎖定緩存鎖定兩個(gè)機(jī)制來(lái)保證復(fù)雜內(nèi)存操作的原子性寓搬。

總線鎖定就是使用處理器提供的一個(gè)#LOCK信號(hào),當(dāng)一個(gè)處理器在總線程上輸出此信號(hào)時(shí)预伺,其他處理器的請(qǐng)求將被阻塞住订咸,那么該處理器可以獨(dú)占共享內(nèi)存。

總線鎖定把CPU和內(nèi)存之間的通信鎖住了酬诀,這使得鎖定期間脏嚷,其他處理器不能操作其他內(nèi)存地址的數(shù)據(jù),所以總線鎖定的開銷比較大瞒御,目前處理器在某些場(chǎng)合下使用緩存鎖定代替總線鎖定來(lái)進(jìn)行優(yōu)化父叙。

緩存鎖定是指內(nèi)存區(qū)域如果被緩存在處理器的緩存行中,并且在LOCK操作期間被鎖定肴裙,那么當(dāng)它執(zhí)行鎖操作回寫到內(nèi)存時(shí)趾唱,處理器不在總線上聲言#LOCK信號(hào),而是修改內(nèi)部的內(nèi)存地址蜻懦,并允許它的緩存一致性機(jī)制來(lái)保證操作的原子性甜癞。

緩存一致性機(jī)制會(huì)阻止同時(shí)修改由兩個(gè)以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù),當(dāng)其它處理器回寫已被鎖定的緩存行的數(shù)據(jù)時(shí)宛乃,會(huì)使緩存行無(wú)效念秧。

有兩種情況下處理器不會(huì)使用緩存鎖定

  • 1.當(dāng)操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部,或操作的數(shù)據(jù)跨多個(gè)緩存行時(shí)峭状,處理器會(huì)調(diào)用總線鎖定茬斧。
  • 2.有些處理器不支持緩存鎖定止吐。如Intel 486和Pentium處理器,就算鎖定的內(nèi)存區(qū)域在處理器的緩存行中也會(huì)調(diào)用總線鎖定。

Java中原子操作

Java中可以通過(guò)循環(huán)CAS的方式來(lái)實(shí)現(xiàn)原子操作。

使用循環(huán)CAS實(shí)現(xiàn)原子操作

JVM中使用的CAS操作利用了處理器提供的CMPXCHG指令實(shí)現(xiàn)的拂玻。

自旋CAS實(shí)現(xiàn)的基本思想是循環(huán)進(jìn)行CAS操作直到成功為止

從 Java 1.5開始宰译,JDK的并發(fā)包里提供了一些類來(lái)支持原子操作檐蚜,如AtomicBoolean(用原子方式更新的boolean值)、AtomicInteger(用原子方式更新的int值)和AtomicLong(用原子方式更新的long值)沿侈。這些原子包裝類還提供了有用的工具方法熬甚,如以原子的方式將當(dāng)前值自增1和自減1。

CAS實(shí)現(xiàn)原子操作有三大問(wèn)題:ABA問(wèn)題肋坚、循環(huán)時(shí)間長(zhǎng)開銷大只能保證一個(gè)共享變量的原子性肃廓。

自旋CAS如果長(zhǎng)時(shí)間不成功智厌,會(huì)給CPU帶來(lái)非常大的執(zhí)行開銷。若JVM能支持處理器提供的pause指令盲赊,效率會(huì)有一定的提升铣鹏。

pause指令可以延遲流水線執(zhí)行指令(de-pipline),也可以避免在退出循環(huán)的時(shí)候因內(nèi)存順序沖突(Memory Order Violation)而引起CPU流水線被清空(CPU Pipelne Flush)哀蘑,從而提高CPU的執(zhí)行效率诚卸。

更多CAS的知識(shí)可參考:CAS初探

使用鎖機(jī)制實(shí)現(xiàn)原子操作

鎖機(jī)制保證了只有獲得鎖的線程才能夠操作鎖定的內(nèi)存區(qū)域

JVM內(nèi)部實(shí)現(xiàn)了很多種鎖機(jī)制绘迁,有偏向鎖合溺、輕量級(jí)鎖和互斥鎖。

除了偏向鎖缀台,JVM實(shí)現(xiàn)鎖的方法都使用了CAS棠赛,即當(dāng)一個(gè)線程想進(jìn)入同步塊的時(shí)候使用循環(huán)CAS的方式來(lái)獲取鎖,當(dāng)它退出同步塊時(shí)使用循環(huán)CAS釋放鎖膛腐。

Java 中大部分容器和框架依賴于 volatile 和原子操作的實(shí)現(xiàn)原理睛约,了解這些原理對(duì)我們進(jìn)行并發(fā)編程會(huì)很有幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哲身,一起剝皮案震驚了整個(gè)濱河市辩涝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勘天,老刑警劉巖怔揩,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉邢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沧踏,警方通過(guò)查閱死者的電腦和手機(jī)歌逢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翘狱,“玉大人秘案,你說(shuō)我怎么就攤上這事×市伲” “怎么了阱高?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茬缩。 經(jīng)常有香客問(wèn)我赤惊,道長(zhǎng),這世上最難降的妖魔是什么凰锡? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任未舟,我火速辦了婚禮,結(jié)果婚禮上掂为,老公的妹妹穿的比我還像新娘裕膀。我一直安慰自己,他們只是感情好勇哗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布昼扛。 她就那樣靜靜地躺著,像睡著了一般欲诺。 火紅的嫁衣襯著肌膚如雪抄谐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天扰法,我揣著相機(jī)與錄音蛹含,去河邊找鬼。 笑死迹恐,一個(gè)胖子當(dāng)著我的面吹牛挣惰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殴边,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憎茂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锤岸?” 一聲冷哼從身側(cè)響起竖幔,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎是偷,沒(méi)想到半個(gè)月后拳氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募逞,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年馋评,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放接。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡留特,死狀恐怖纠脾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜕青,我是刑警寧澤苟蹈,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站右核,受9級(jí)特大地震影響慧脱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贺喝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一菱鸥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躏鱼,春花似錦采缚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篡帕。三九已至殖侵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镰烧,已是汗流浹背拢军。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怔鳖,地道東北人茉唉。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像结执,于是被迫代替她去往敵國(guó)和親度陆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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