標籤:volatile port code mod 輸送量 pac 類變數 icm demo
一.基本類原子操作
基本類原子操作的類主要有: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。
package com.study.refrence;import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;public class AtomicIntegerFieldUpdaterDemo { class DemoData { public volatile int value1 = 1; volatile int value2 = 2; protected volatile int value3 = 3; private volatile int value4 = 4; } AtomicIntegerFieldUpdater<DemoData> getUpdater(String fieldName) { return AtomicIntegerFieldUpdater.newUpdater(DemoData.class, fieldName); } void doit() { DemoData data = new DemoData(); System.out.println("1 ==> " + getUpdater("value1").getAndSet(data, 10)); System.out.println("3 ==> " + getUpdater("value2").incrementAndGet(data)); System.out.println("2 ==> " + getUpdater("value3").decrementAndGet(data)); System.out.println("true ==> " + getUpdater("value4").compareAndSet(data, 4, 5)); } public static void main(String[] args) { AtomicIntegerFieldUpdaterDemo demo = new AtomicIntegerFieldUpdaterDemo(); demo.doit(); }}
三.原子數組類操作
AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray<E>
這些類除了進行操作的對象更改為數組之外,與基本類原子操作並沒有什麼大的區別.
四.帶有標記位的對象引用
AtomicMarkableReference類描述的一個<Object,Boolean>的對,可以原子的修改Object或者Boolean的值,這種資料結構在一些緩衝或者狀態原因中比較有用。
這種結構在單個或者同時修改Object/Boolean的時候能夠有效提高輸送量。
AtomicStampedReference類維護帶有整數“標誌”的對象引用,可以用原子方式對其進行更新。對比AtomicMarkableReference類的<Object,Boolean>,
AtomicStampedReference維護的是一種類似<Object,int>的資料結構,其實就是對對象(引用)的一個並發計數。但是與AtomicInteger不同的是,此資料結構可以攜帶
一個對象引用(Object),並且能夠對此對象和計數同時進行原子操作。
java 原子類