原理剖析(第004編)CAS動作原理分析

2901 ワード

原理剖析(第004編)CAS動作原理分析

  • 一、大まかに紹介する
    1、          ,       CAS AQS,                     ,     ;
    2、               ,                Java             ;
    3、             CAS     ;
    

    二、原理分析
    2.1 CASとは?
    1、CAS,compare and swap   ,    ,     ,  “  -  -   ”            ;
    
    2、CAS        :    (V)、   (A)、  (B);
               V    A   ,                  B,     ;
    

    2.2 CAS原理
    1、CAS  JNI           C  ,      C     CPU             ;
    
    2、CAS   CPU     ,    cmpxchg    (       Lock  )      ;
    

    2.3 CASコアソース
    1、CAS    :
    // Adding a lock prefix to an instruction on MP machine
    // VC++ doesn't like the lock prefix to be on a single line
    // so we can't insert a label after the lock prefix.
    // By emitting a lock prefix, we can define a label after it.
    #define LOCK_IF_MP(mp) __asm cmp mp, 0  \
                           __asm je L0      \
                           __asm _emit 0xF0 \
                           __asm L0:
    
    inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {
      // alternative for InterlockedCompareExchange
      int mp = os::is_MP();
      __asm {
        mov edx, dest
        mov ecx, exchange_value
        mov eax, compare_value
        LOCK_IF_MP(mp) //          ,     Lock    ,Lock    Volatile       
        cmpxchg dword ptr [edx], ecx // 
      }
    }
    
    2、           cmpxchg                ,         lock    ,    lock  ;
    
    3、  lock               ,   Volatile  ,     [    (  001  )Volatile      ];
    

    三、CASの欠点
    3.1、ABA問題
    1、     ,    ABA  ;
         i   i=5,A   i++    ,B   i--    ,C      i=5   i      ;
    
    2、    C     i       ,      ,     AB      i       ;
    
    3、        ,   C  i       ,   Java1.5     AtomicStampedReference    ABA  ;
    
    4、AtomicStampedReference                 ,                 ;
    
    5、        AtomicMarkableReference    ABA  ,                  ABA     ;
               boolean       ,      true false        ,    ABA       ,     ABA     ;
    

    3.2、出費が多い
    1、    CAS Java   :
        public final int getAndSetInt(Object var1, long var2, int var4) {
            int var5;
            do {
                var5 = this.getIntVolatile(var1, var2);
            } while(!this.compareAndSwapInt(var1, var2, var5, var4));
    
            return var5;
        }
    
    2、        ,  CAS         ,              ,  CPU          ;
    

    3.3、原子操作制約
    1、   CAS               ;
    
    2、            ,CAS    ,                  ,  AtomicReference              ;
    

    四、まとめ
    1、                           CAS      ;
    
    2、                       CAS      ;
    
    3、                CAS,           ,           ABA  。
    

    五、ダウンロードアドレス
    https://gitee.com/ylimhhmily/SpringCloudTutorial.git
    SpringCloudTutorial交流QQ群:235322432
    SpringCloudTutorial交流微信群:微信コミュニケーション群QRコードピクチャーリンク
    注目を歓迎して、あなたのはきっと私に対する最大の支持です!!!