原子操作的實(shí)現(xiàn)原理

簡書 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

原子(atomic),本意是指“不能被進(jìn)一步分割的粒子”。原子操作意味著“不可被中斷的一個(gè)或一系列操作”。

接下去一起看看在Intel處理器和Java里是如何實(shí)現(xiàn)原子操作的。

術(shù)語定義

  • Cache line(緩存行)
  • Compare and Swap(比較并交換)
  • cpu pipeline(cpu流水線)
  • memory order violation(內(nèi)存順利沖突)

處理器實(shí)現(xiàn)原子操作

當(dāng)處理器讀取內(nèi)存的一個(gè)字節(jié)時(shí),其它處理器不能訪問這個(gè)字節(jié)的內(nèi)存地址,最新的處理器能自動(dòng)保證處理器對(duì)同一緩存行里進(jìn)行16/32/64位的操作是原子的。處理器提供總線鎖定緩存鎖定的機(jī)制保證復(fù)雜內(nèi)存操作的原子性。

1、總線鎖保證原子性

使用處理器提供的一個(gè)LOCK#信號(hào),當(dāng)一個(gè)處理器在總線上輸出此信號(hào)時(shí),其它處理器的請(qǐng)求將被阻塞,那么該處理器就能獨(dú)自共享內(nèi)存。

2、緩存鎖保證原子性

“緩存鎖定”指內(nèi)存區(qū)域如果被緩存在處理器的緩存行中,并且在Lock操作期間被鎖定,那么當(dāng)它執(zhí)行鎖操作回寫到內(nèi)存時(shí),處理器不需要在總線上聲言LOCK#信號(hào),而是修改內(nèi)部的內(nèi)存地址,通過緩存一致性機(jī)制保證操作的原子性。
例外:當(dāng)操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部,或操作的數(shù)據(jù)跨多個(gè)緩存行,處理器會(huì)調(diào)用總線鎖定。

緩存一致性

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

Java原子操作實(shí)現(xiàn)

在Java中通過鎖和循環(huán)CAS的方式實(shí)現(xiàn)原子操作。

CAS

jvm中的CAS操作是基于處理器的CMPXCHG指令實(shí)現(xiàn)的,CAS存在三個(gè)問題:

  • ABA問題
  • 循環(huán)時(shí)間長開銷大
  • 只能保證一個(gè)共享變量的原子操作

鎖機(jī)制保證了只有獲得鎖的線程才能操作鎖定的內(nèi)存區(qū)域,具體實(shí)現(xiàn)可以參考java synchronized

END。
我是占小狼。
在魔都艱苦奮斗,白天是上班族,晚上是知識(shí)服務(wù)工作者。
讀完我的文章有收獲,記得關(guān)注和點(diǎn)贊哦,如果非要打賞,我也是不會(huì)拒絕的啦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容