多線程知識點整理之原子類(二)


Atomic

  • 原子操作類

  • 數據類型

    • AtomicInteger 中主要實現了整型的原子操作,防止併發情況下出現異常結果,其內部主要依靠JDK 中的unsafe 類操作內存中的數據來實現的。volatile 修飾符保證了value在內存中其他線程可以看到其值得改變。CAS操作保證了AtomicInteger 可以安全的修改value 的值。

    • AtomicBoolean 

    • AtomicInteger

    • AtomicLong

    • AtomicReference

  • set( )和get( )方法:可以原子地設定和獲取atomic的數據。類似於volatile,保證數據會在主存中設置或讀取

  • getAndSet( )方法

    • 原子的將變量設定爲新數據,同時返回先前的舊數據

    • 其本質是get( )操作,然後做set( )操作。儘管這2個操作都是atomic,但是他們合併在一起的時候,就不是atomic。在Java的源程序的級別上,如果不依賴synchronized的機制來完成這個工作,是不可能的。只有依靠native方法纔可以。

  • compareAndSet( ) 和weakCompareAndSet( )方法

    • 這兩個方法都是conditional modifier方法。這2個方法接受2個參數,一個是期望數據(expected),一個是新數據(new);如果atomic裏面的數據和期望數據一致,則將新數據設定給atomic的數據,返回true,表明成功;否則就不設定,並返回false。

  • 對於AtomicInteger、AtomicLong還提供了一些特別的方法。getAndIncrement( )、incrementAndGet( )、getAndDecrement( )、decrementAndGet ( )、addAndGet( )、getAndAdd( )以實現一些加法,減法原子操作。(注意 --i、++i不是原子操作,其中包含有3個操作步驟:第一步,讀取i;第二步,加1或減1;第三步:寫回內存)

  • sun.misc.Unsafe

    • sun.misc.Unsafe是JDK內部用的工具類。它通過暴露一些Java意義上說“不安全”的功能給Java層代碼,來讓JDK能夠更多的使用Java代碼來實現一些原本是平臺相關的、需要使用native語言(例如C或C++)纔可以實現的功能。該類不應該在JDK核心類庫之外使用。

  • 樂觀鎖用到的機制是CAS

  • CAS

    • CAS是英文單詞Compare and Swap的縮寫,翻譯過來就是比較並替換。

    • CAS機制中使用了3個基本操作數:內存地址V,舊的預期值A,要修改的新值B。

    • 更新一個變量的時候,只有當變量的預期值A和內存地址V當中的實際值相同時,纔會將內存地址V對應的值修改爲B。

    • CAS的缺點

      • CPU開銷過大

      • 不能保證代碼塊的原子性

        • CAS機制所保證的知識一個變量的原子性操作,而不能保證整個代碼塊的原子性。比如需要保證3個變量共同進行原子性的更新,就不得不使用synchronized了。

      • ABA問題

        • 當一個值從A變成B,又更新回A,普通CAS機制會誤判通過檢測。

        • 利用版本號比較可以有效解決ABA問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章