原子操作


CPU術語
緩存行(Cache line):緩存的最小單位
比較並交換(Compare and Swap):CAS操作需要輸入兩個數值,一個舊值,一個新值,在操作期間先比較舊值有沒有發生變化,如果沒有發生變化,才交換成新值,發生了變化則不交換
CPU流水線(CPU pipeline):在CPU中由5~6個不同功能的電路單元組成一條指令處理流水線,然后將一條X86指令分成5~6步后再由這些電路單元分別執行,這樣就能實現在一個CUP時鍾周期完成一條指令,從而提高CPU的運算速度
內存順序沖突(Memory order violation):內存順序沖突一般是由假共享引起的,假共享是指多個CPU同時修改同一個緩存行的不同部分而引起其中一個CPU的操作無效,當出現內存順序沖突時,CPU必須清空流水線
 
處理器實現原子操作
1.使用總線鎖保證原子性:   
   如果多個處理器同時對共享變量進行讀寫操作(i++),那么共享變量就會被多個處理器同時進行操作,這樣讀改寫操作就不是原子的,操作完之后共享變量的值會和期望的不一致。
    總線鎖其實就是使用處理器提供的一個LOCK#信號,當一個處理器在總線上輸出此信號時,其他處理器的請求將被阻塞住,那么該處理器可以獨占共享內存。
 
2.使用緩存鎖保證原子性:   
   在同一時刻,只需保證對某個內存地址的操作是原子性即可,但總線鎖把CPU和內存之間的通信鎖住了,這使得鎖定期間,其他處理器不能操作其他內存地址的數據,所以總線鎖的開銷比較大,緩存鎖可以在某些場合代替總線鎖來進行優化。
    頻繁使用內存會緩存在處理器的L1、L2和L3高速緩存里,原子操作就可以直接在處理器內部緩存中進行,並不需要聲明總線鎖。在Pentium6和目前的處理器中可以使用緩存鎖的方式來實現復雜的原子性。
    緩存鎖定是指內存區域如果被緩存在處理器的緩存行中,並且在Lock操作期間被鎖定,那么當它執行鎖操作回寫到內存時,處理器不在總線上聲明LOCK#信號,而是修改內部的內存地址,並允許它的緩存一致性機制來保證操作的原子性,因為緩存一致性機制會阻止同時修改由兩個以上處理器緩存的內存區域數據,當其他處理器回寫已被鎖定的緩存行的數據時,會使緩存行無效。但是有兩種情況下處理器不會使用緩存鎖定
1.當操作的數據不能被緩存在處理器內部,或操作的數據跨多個緩存行(cache line)時,則處理器會調用總線鎖定;2.有些處理器不支持緩存鎖定
 
3.Java實現原子操作:通過鎖和循環CAS的方式來實現原子操作
(1)使用循環CAS實現原子操作:JVM中的CAS利用了處理器提供的CMPXCHG指令實現的。自旋CAS實現的基本思路就是循環進行CAS操作直到成功為止
    jdk1.5並發包提供如AtomicBoolean(用院子方式更新boolean值)、AtomicInteger(用原子方式更新int值)等來支持原子操作
(2)CAS實現原子操作的三大問題: 
    1-ABA問題。因為CAS需要在操作值的時候,檢查值有沒有發生變化,如果沒有發生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那么使用CAS進行檢查時會發現它的值沒有變化,但實際上是變化了。ABA問題的解決思路就是使用版本號。在變量前面追加版本號,每次變量更新的時候版本號加1,那么A-B-A就變成1A-2B-3A
jdk1.5中Atomic包里提供了一個AtomicStampedReference來解決ABA問題。這個累的compareAndSet方法的作用是首先檢查當前引用是否等於預期引用,並且檢查當前標志是否等於預期標志,如果全部相等,則以原子方式將該引用和該標志的值設置為給定的更新值。
    2-循環時間長開銷大。自旋CAS如果長時間不成功,會給CPU帶來非常大的執行開銷。如果JVM能支持處理器提供的pause指令,那么會提升一定的效率。pause指令有兩個作用:1.延遲流水線執行指令(de-pipeline),2.可以避免在退出循環的時候因內存順序沖突而引起流水線被清空
    3-只能保證一個共享變量的原子操作。當對一個共享變量執行操作時,我們可以使用循環CAS的方式來保證原子操作,但是對多個共享變量操作時,循環CAS就無法保證操作的原子性,這時就可以用鎖。
(3)使用鎖機制實現原子操作:
        鎖機制保證了只有獲得鎖的線程才能夠操作鎖定的內存區域。JVM內部實現了很多種鎖機制,有偏向鎖、輕量級鎖和互斥鎖。除了偏向鎖,JVM實現鎖的方式都用了循環CAS,即當一個線程想進入同步塊的時候使用循環CAS的方式來獲取鎖,當它退出同步塊的時候使用循環CAS釋放鎖
 
來自<Java並發編程>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM