Java中的13個原子操作類

  • 2019 年 11 月 9 日
  • 筆記

說明:本篇文章是在閱讀《Java 並發編程藝術》過程中的一些筆記和分析 文章來源:https://www.iteye.com/blog/xiaoheng-2509522

該項目的地址:https://github.com/xiaoheng1/concurrent-programming

歡迎有興趣的小夥伴加入,一起討論、分析,共同進步!

atomic 包中的 13 個類,屬於 4 中類型的原子更新方式.

  • (1)原子更新基本類型
  • (2)原子更新數組
  • (3)原子更新引用
  • (4)原子更新屬性

atomic 包里的類基本都是使用 Unsafe 實現的包裝類.

1.原子更新基本類型

  • (1) AtomicBoolean
  • (2) AtomicInteger
  • (3) AtomicLong

本類以 AtomicInteger 進行講解:

int addAndGet(int delta) 以原子方式將輸入的數值與實例中的值相加,並返回結果

boolean compareAndSet(int expect, int update) 如果輸入的數值等於預期值,則以原子的方式將該值設置為輸入的值.

int getAndIncrement() 以原子方式將當前值加 1,注意,這裡返回的是自增前的值.

void lazySet(int newValue) 最終會設置成 newValue,使用 lazySet 設置值後,可能導致其他線程在之後的一小段時間內還是可以讀到 舊值.

int getAndSet(int newValue) 以原子方式設置為 newValue 的值,並返回舊值.

getAndIncrement 是如何實現原子操作的了?

public final int getAndIncrement() {      for (;;) {          int current = get();          int next = current + 1;          if (compareAndSet(current, next))              return current;      }  }

我們可以看到,它的實現原理是死循環 + CAS.

2.原子更新數組

  • (1) AtomicIntegerArray 原子更新整形數組裡的元素
  • (2) AtomicLongArray 原子更新長整形數組裡的元素
  • (3) AtomicReferenceArray 原子更新引用類型數組裡的元素

AtomicIntegerArray 類提供方法如下:(1) int addAndGet(int i, int delta) 以原子方式將輸入值與數組中的索引 i 的元素相加 (2) boolean compareAndSet(int i, int expect, int update) 如果當前值等於預期值,則以原子方式將數組位置 i 的元素設置成 update 值.

3.原子更新引用類型

原子更新基本類型的 AtomicInteger, 只能更新一個變量,如果要原子更新多個變量,就需要使用這個原子更新引用類型提供的類.

  • (1) AtomicReference 原子更新引用類型
  • (2) AtomicReferenceFieldUpdate 原子更新引用類型里的字段
  • (3) AtomicMarkableReference 原子更新帶有標記位的引用類型.

推薦閱讀

為什麼redis哨兵集群只有2個節點無法正常工作?

Spring Boot 集成 Ehcache 緩存,三步搞定!