java 原子類


一、基本類原子操作

  AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference<V>對boolean,Integer,long,reference定義的變量進行原子性的操作,

簡單點說就是它提供的方法都是原子性的,不會出現線程之間存在的問題

 

二、原子類更新

AtomicIntegerFieldUpdater<T>, AtomicLongFieldUpdater<T>, AtomicReferenceFieldUpdater<T,V> 

  (1)字段必須是volatile類型

  (2)調用者能夠直接操作對象字段,那么就可以反射進行原子操作。但是對於父類的字段,子類是不能直接操作的,盡管子類可以訪問父類的字段。

  (3)只能是實例變量,不能是類變量,也就是說不能加static關鍵字。

  (4)只能是可修改變量,不能使final變量,因為final的語義就是不可修改。

  (5)對於AtomicIntegerFieldUpdaterAtomicLongFieldUpdater只能修改int/long類型的字段,不能修改其包裝類型(Integer/Long)。

如果要修改包裝類型就需要使用AtomicReferenceFieldUpdater

  

    static class DemoData {
         volatile int value1 = 1;
        volatile int value2 = 2;
        private volatile int value3 = 3;
         volatile int value4 = 4;
    }

    static  AtomicIntegerFieldUpdater<DemoData> getUpdater(String fieldName) {
        return AtomicIntegerFieldUpdater.newUpdater(DemoData.class, fieldName);
    }

    public static void main(String[] args) {

        DemoData data = new DemoData();
        //getAndSet() Atomically sets the field of the given object managed by this updater to the given value and returns the old value.
        System.out.println("1 ==> " + getUpdater("value1").getAndSet(data, 10));
        System.out.println("2 ==> " + getUpdater("value2").incrementAndGet(data));
        System.out.println("3 ==> " + getUpdater("value3").decrementAndGet(data));  //報錯
        System.out.println("4 ==> " + getUpdater("value4").compareAndSet(data, 4, 5));
    }

  

四、帶有標記位的對象引用

    AtomicMarkableReference類描述的一個<Object,Boolean>的對,可以原子的修改Object或者Boolean的值,這種數據結構在一些緩存或者狀態描述中比較有用。

這種結構在單個或者同時修改Object/Boolean的時候能夠有效的提高吞吐量。 AtomicStampedReference類維護帶有整數“標志”的對象引用,可以用原子方式對其進行更新。

對比AtomicMarkableReference類的<Object,Boolean>,AtomicStampedReference維護的是一種類似<Object,int>的數據結構,其實就是對象(引用)的一個並發計數。

但是與AtomicInteger不同的是,此數據結構可以攜帶一個對象引用(Object),並且能夠對此對象和計數同時進行原子操作。

 

四。使用場景

netty DefaultPromise源碼


免責聲明!

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



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