簡書 占小狼
轉(zhuǎn)載請注明原創(chuàng)出處橡娄,謝謝!
原子(atomic)癣籽,本意是指“不能被進一步分割的粒子”挽唉。原子操作意味著“不可被中斷的一個或一系列操作”。
接下去一起看看在Intel處理器和Java里是如何實現(xiàn)原子操作的筷狼。
術(shù)語定義
- Cache line(緩存行)
- Compare and Swap(比較并交換)
- cpu pipeline(cpu流水線)
- memory order violation(內(nèi)存順利沖突)
處理器實現(xiàn)原子操作
當處理器讀取內(nèi)存的一個字節(jié)時瓶籽,其它處理器不能訪問這個字節(jié)的內(nèi)存地址,最新的處理器能自動保證處理器對同一緩存行里進行16/32/64位的操作是原子的埂材。處理器提供總線鎖定和緩存鎖定的機制保證復(fù)雜內(nèi)存操作的原子性塑顺。
1、總線鎖保證原子性
使用處理器提供的一個LOCK#信號俏险,當一個處理器在總線上輸出此信號時柬批,其它處理器的請求將被阻塞口锭,那么該處理器就能獨自共享內(nèi)存。
2、緩存鎖保證原子性
“緩存鎖定”指內(nèi)存區(qū)域如果被緩存在處理器的緩存行中龄广,并且在Lock操作期間被鎖定炉菲,那么當它執(zhí)行鎖操作回寫到內(nèi)存時疲陕,處理器不需要在總線上聲言LOCK#信號鞠值,而是修改內(nèi)部的內(nèi)存地址墓赴,通過緩存一致性機制保證操作的原子性。
例外:當操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部航瞭,或操作的數(shù)據(jù)跨多個緩存行诫硕,處理器會調(diào)用總線鎖定。
緩存一致性
緩存一致性會阻止同時修改由兩個以上處理器的內(nèi)存區(qū)域數(shù)據(jù)刊侯,當其他處理器回寫被鎖定的緩存行數(shù)據(jù)時痘括,會使其它處理器的緩存行無效。
Java原子操作實現(xiàn)
在Java中通過鎖和循環(huán)CAS的方式實現(xiàn)原子操作滔吠。
CAS
jvm中的CAS操作是基于處理器的CMPXCHG指令實現(xiàn)的,CAS存在三個問題:
- ABA問題
- 循環(huán)時間長開銷大
- 只能保證一個共享變量的原子操作
鎖
鎖機制保證了只有獲得鎖的線程才能操作鎖定的內(nèi)存區(qū)域挠日,具體實現(xiàn)可以參考java synchronized
END疮绷。
我是占小狼。
在魔都艱苦奮斗嚣潜,白天是上班族冬骚,晚上是知識服務(wù)工作者。
讀完我的文章有收獲懂算,記得關(guān)注和點贊哦只冻,如果非要打賞,我也是不會拒絕的啦计技!