原子操作實現原理-學習筆記


  • 原子操作:不可被中斷的一個或者一系列操作。
  • 緩存行(cache line):緩存的最小操作單位。
  • 比較並交換(compare and swap, CAS):CAS需要輸入兩個數值,一個舊值(期望操作前的值)和一個新值,在操作期間先比較舊值有無發生變化,如果沒有變化才交換成新值,反之,則不交換。
  • 處理器實現原子操作 
    1. 處理自動保證基本內存操作的原子性。只保證單個字節的處理操作,復雜的內存操作處理器不能自動保證原子性。
    2. 使用總線鎖保證原子性。處理器提供一個LOCK信號,當一個處理器在總線上輸出此信號時,其它處理器的請求將被阻塞住。缺點:鎖定期間,其它處理器不能操作其它內存地址,開銷大。
    3. 使用緩存鎖保證原子性。頻繁使用的內存會緩存在處理器的L1,L2和L3高速緩存里,原子操作可以直接在處理器內部緩存中進行,不需要聲明總線鎖。當一個數據同時被兩個以上處理器緩存以后,緩存的一致性會阻止同時修改處理器中緩存的數據。有兩種情況不能使用緩存鎖定:
  1. 當操作的數據不能被緩存在處理器內部,或操作的數據跨多個緩存行。
  2. 有些處理器不支持緩存鎖定。
  • JAVA實現原子操作 
    1. 使用循環CAS實現原子鎖–自旋CAS實現的基本思路就是循環進行CAS操作直到成功為止。
    2. CAS的問題: ABA問題-通過增加版本號/標志解決。循環時間長開銷大。只能保證一個共享變量的原子操作–通過AtomicReference類來保證引用對象之間的原子性,把多個變量放在一個對象中進行CAS操作。
    3. 使用鎖機制實現原子操作。鎖機制保證了只有獲得鎖的線程才能夠操作鎖定的內存區域。實現有偏向鎖、輕量級鎖和互斥鎖。其中后兩種實現的方式都用到了循環CAS–當一個線程進入同步塊時使用循環CAS的方式來獲取鎖,退出時使用循環CAS釋放鎖。

參考:

  1. Java SE 1.6 中的Synchronized
  2. Intel 64和IA-32架構軟件開發人員手冊
  3. 深入分析Volatile的實現原理
  4. http://www.infoq.com/cn/articles/atomic-operation


免責聲明!

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



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