深入淺出 Java Concurrency (2): 原子操作 part 1

Java原子操作類彙總

當程序更新一個變量時,如果是多線程同時更新這個變量,可能得到的結果與期望值不同。比如:有一個變量i,A線程執行i+1,B線程也執行i+1,經過兩個線程的操作後,變量i的值可能不是期望的3,而是2。這是因爲,可能在A線程和B線程執行的時候拿到的i的值都是1,這就是線程不安全的更新操作,通常我們會使用synchronized來解決這個問題,synchronized能保證多線程不會同時更新變量i.

從java1.5開始,jdk提供了java.util.concurrent.atomic包,這個包中的原子操作類,提供了一種用法簡單,性能高效,線程安全的更新一個變量的方式。

atomic包裏面一共提供了13個類,分爲4種類型,分別是:原子更新基本類型,原子更新數組,原子更新引用,原子更新屬性,這13個類都是使用Unsafe實現的包裝類。

一、原子更新基本類型

atomic提供了3個類用於原子更新基本類型:分別是AtomicInteger原子更新整形,AtomicLong原子更新長整形,AtomicBoolean原子更新bool值。由於這三個類提供的方法幾乎是一樣的,因此本節以AtomicInteger爲例進行說明。

AtomicInteger的常用方法有:

  1. int addAndGet(int delta):以原子的方式將輸入的值與實例中的值相加,並把結果返回
  2. boolean compareAndSet(int expect, int update):如果輸入值等於預期值,以原子的方式將該值設置爲輸入的值
  3. final int getAndIncrement():以原子的方式將當前值加1,並返回加1之前的值
  4. void lazySet(int newValue):最終會設置成newValue,使用lazySet設置值後,可能導致其他線程在之後的一小段時間內還是可以讀到舊的值。
  5. int getAndSet(int newValue):以原子的方式將當前值設置爲newValue,並返回設置之前的舊值

佔位

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章