一、基本類原子操作
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)對於AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改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源碼