java并發(fā)編程(三)

java多線程編程(三)

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

1.術(shù)語定義

CPU術(shù)語的定義.png

2.處理器如何實現(xiàn)原子操作

(1)使用總線鎖保證原子性

第一個機(jī)制是通過總線鎖保證原子性。如果多個處理器同時對共享變量進(jìn)行讀改寫操作(i++就是經(jīng)典的讀改寫操作),那么共享變量就會被多個處理器同時進(jìn)行操作,這樣讀改寫操作就不是原子的,操作完之后共享變量的值會和期望的不一致。舉個例子,如果i=1,我們進(jìn)行兩次i++操作,我們期望的結(jié)果是3,但是有可能結(jié)果是2。

原因可能是多個處理器同時從各自的緩存中讀取變量i,分別進(jìn)行加1操作,然后分別寫入系統(tǒng)內(nèi)存中。那么,想要保證讀改寫共享變量的操作是原子的,就必須保證CPU1讀改寫共享變量的時候,CPU2不能操作緩存了該共享變量內(nèi)存地址的緩存。

處理器使用總線鎖就是來解決這個問題的。所謂總線鎖就是使用處理器提供的一個LOCK#信號,當(dāng)一個處理器在總線上輸出此信號時,其他處理器的請求將被阻塞住,那么該處理器可以獨(dú)占共享內(nèi)存。

(2)使用緩存鎖保證原子性

但是有兩種情況下處理器不會使用緩存鎖定。
第一種情況是:當(dāng)操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部,或操作的數(shù)據(jù)跨多個緩存行(cache line)時,則處理器會調(diào)用總線鎖定。
第二種情況是:有些處理器不支持緩存鎖定。對于Intel 486和Pentium處理器,就算鎖定的內(nèi)存區(qū)域在處理器的緩存行中也會調(diào)用總線鎖定。
針對以上兩個機(jī)制,我們通過Intel處理器提供了很多Lock前綴的指令來實現(xiàn)。例如,位測試和修改指令:BTS、BTR、BTC;交換指令XADD、CMPXCHG,以及其他一些操作數(shù)和邏輯指令(如ADD、OR)等,被這些指令操作的內(nèi)存區(qū)域就會加鎖,導(dǎo)致其他處理器不能同時訪問它。

3.Java如何實現(xiàn)原子操作

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

(2)CAS實現(xiàn)原子操作的三大問題

    1)ABA問題,就像一個人繞了遠(yuǎn)路還是走的原來的路嗎?
         不是
    解決方案:加上版本號
    2)循環(huán)時間長開銷大:
    自旋CAS如果長時間不成功,會給CPU帶來非常大的執(zhí)行開銷。如果JVM能支持處理器提供的pause指令,那么效率會有一定的提升。pause指令有兩個作用:第一,它可以延遲流水線執(zhí)行指令(de-pipeline),使CPU不會消耗過多的執(zhí)行資源,延遲的時間取決于具體實現(xiàn)的版本,在一些處理器上延遲時間是零;第二,它可以避免在退出循環(huán)的時候因內(nèi)存順序沖突(Memory Order Violation)而引起CPU流水線被清空(CPU Pipeline Flush),從而提高CPU的執(zhí)行效率
    3)只能保證一個共享變量的原子操作
    當(dāng)對一個共享變量執(zhí)行操作時,我們可以使用循環(huán)CAS的方式來保證原子操作,但是對多個共享變量操作時,循環(huán)CAS就無法保證操作的原子性,這個時候就可以用鎖。還有一個取巧的辦法,就是把多個共享變量合并成一個共享變量來操作。比如,有兩個共享變量i=2,j=a,合并一下ij=2a,然后用CAS來操作ij。從Java 1.5開始,JDK提供了AtomicReference類來保證引用對象之間的原子性,就可以把多個變量放在一個對象里來進(jìn)行CAS操作。

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

鎖機(jī)制保證了只有獲得鎖的線程才能夠操作鎖定的內(nèi)存區(qū)域。JVM內(nèi)部實現(xiàn)了很多種鎖機(jī)制,有偏向鎖、輕量級鎖和互斥鎖。有意思的是除了偏向鎖,JVM實現(xiàn)鎖的方式都用了循環(huán)CAS,即當(dāng)一個線程想進(jìn)入同步塊的時候使用循環(huán)CAS的方式來獲取鎖,當(dāng)它退出同步塊的時候使用循環(huán)CAS釋放鎖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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