《java併發程式設計的藝術》原子操作類
java.util.concurrent.atomic包,4種原子更新方式:原子更新基本資料,原子更新陣列,原子更新引用,原子更新屬性。
原子更新基本型別
包含3個類:AtomicBoolean,AtomicInteger,AtomicLong
以AtomicInteger
為例,常用方法有:
- int addAndGet(int delta) 以原子方式相加並返回結果
- boolean compareAndSet(int expect,int update)如果輸入的數值等於預期值,則以原子方式將該值設定為輸入的值
- int getAndIncrement()以原子方式將當前值加1,返回自增前的值
- void lazySet(int newValue)將值設定為newValue,但是需要一些時間。
- int getAndSet(int newValue)以原子方式設定為newValue,返回舊值
AtomicInteger a = new AtomicInteger(5);
System.out.println(a.getAndIncrement()); //輸出5 值為6
System.out.println(a.getAndIncrement()); //輸出6 值為7
System.out.println(a.compareAndSet(7, 9)); //此時值為7,所以值會變更為9並返回true。否則返回false,值不變。
原子更新陣列
包含4個類:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray,AtomicIntegerArray,AtomicDoubleArray
常用方法:
- int addAndGet(int i,int delta)以原子方式將索引為i的和delta相加。
- boolean compareAndSet(int i,int expect,int update)獲取索引i的值compareAndSet
int[] b = new int[]{1, 2};
AtomicIntegerArray array = new AtomicIntegerArray(b);
System.out.println(array.addAndGet(0, 5));//array索引為0的值更新為6
原子更新引用型別
包含3個類:AtomicReference,AtomicReferenceFieldUpdater,AtomicMarkableReference
User user = new User("www",20);
User user1 = new User("ww", 5);
AtomicReference<User> reference = new AtomicReference<>();
reference.set(user);
reference.compareAndSet(user, user1);
System.out.println(reference.get().getName()); //[5, 6]
原子更新欄位類
原子更新某個類裡的某個欄位:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicStampedReference
要想原子的更新欄位有兩步:
1.使用靜態方法newUpdater建立一個更新器,並且設定欲更新的類和屬性
2.更新類的欄位必須使用public volatile修飾符
AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
//User有一個欄位為age,相當於操作該欄位
相關文章
- 《java併發程式設計的藝術》併發工具類Java程式設計
- 【Java併發程式設計的藝術】第二章讀書筆記之原子操作Java程式設計筆記
- Java併發程式設計藝術Java程式設計
- 《java併發程式設計的藝術》Executor框架Java程式設計框架
- Java 併發包原子操作類解析Java
- 《java併發程式設計的藝術》併發容器和框架Java程式設計框架
- Java併發程式設計的藝術,解讀併發程式設計的優缺點Java程式設計
- Java併發程式設計的藝術(五)——中斷Java程式設計
- 併發程式設計基礎與原子操作程式設計
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- 《java併發程式設計的藝術》記憶體模型Java程式設計記憶體模型
- 《java併發程式設計的藝術》執行緒池Java程式設計執行緒
- 【讀書筆記】Java併發程式設計的藝術筆記Java程式設計
- C++11併發程式設計:原子操作atomicC++程式設計
- Go併發程式設計之原子操作sync/atomicGo程式設計
- Java併發程式設計之原子變數Java程式設計變數
- 如何評價《Java 併發程式設計藝術》這本書?Java程式設計
- 併發程式設計的原子性 != 事務ACID的原子性程式設計
- Java併發程式設計之Java CAS操作Java程式設計
- java併發程式設計:Thread類的使用Java程式設計thread
- java併發程式設計JUC第十二篇:AtomicInteger原子整型Java程式設計
- Java併發程式設計-併發程式設計的Bug源頭:可見性、原子性和有序性問題Java程式設計
- 併發程式設計面試必備:JUC 中的 Atomic 原子類總結程式設計面試
- Java原子類操作原理剖析Java
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- Java併發程式設計---java規範與模式下的併發程式設計1.1Java程式設計模式
- 併發程式設計(二)——併發類容器ConcurrentMap程式設計
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- Java原子操作類,你知道多少?Java
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- Java併發程式設計非同步操作Future和FutureTaskJava程式設計非同步
- Java併發程式設計藝術第二章-----第二遍讀後記錄Java程式設計
- Java併發程式設計—ThreadLocalJava程式設計thread
- Java併發程式設計:synchronizedJava程式設計synchronized
- Java併發程式設計 -- ThreadLocalJava程式設計thread
- Java併發程式設計 -- ConditionJava程式設計