天天看點

java.util.concurrent.atomic

本文目錄

1 Compare And Swap(CAS)

2 Atomic

1 Compare And Swap(CAS)

CAS是一種無鎖的非阻塞算法。

CAS是一種樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,隻有其中一個可以更新變量的值,其它線程都将失敗,并繼續嘗試更新。

在CAS中有3個操作數:記憶體值V,預期舊值A,新值B。

當且僅當預期舊值A與記憶體值V相等時,才将記憶體值V修改為B,否則,失敗。

簡單示例:

(1) 獲得舊的值A:int a =get();

(2) 計算新的值B:int b = a +1;

(3) 寫入新的值B:set(a, b);

說明:

在設定新值的時候,給出預期舊值A;

若此時,記憶體值與預期舊值A相同,則說明期間未有其它線程修改過該值,無沖突,可寫入新值B;

若此時,記憶體值與預期舊值A不同,則說明期間有其它線程修改過該值,有沖突,基于舊值a計算得到的新值b已經無效。

2 Atomic

為了避免使用synchronized關鍵字(會降低性能),Java提供了實作CAS技術的類,可以在非激烈競争的情況下,以更小的開銷及更高的性能,使一些操作具備線程安全性。

java.util.concurrent.atomic中的常用類:

AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference<V>等。

2.1 AtomicInteger類

import java.util.concurrent.atomic.AtomicInteger;
 
public classCounter {
 
    public volatile static AtomicInteger atoInt = new AtomicInteger(0);
 
    public static void increase() {
       atoInt.incrementAndGet();
    }
 
    public static void decrease() {
       atoInt.decrementAndGet();
    }
 
    public static int get() {
       return atoInt.get();
    }
 
    public static void main(String[] args) throws InterruptedException {
 
       for (int i = 0; i < 1000; i++) {
           new Thread(new Runnable() {
              @Override
              public void run() {
                  Counter.increase();
              }
           }).start();
       }
 
       Thread.sleep(1000);
 
       // 由于線程安全, 每次結果都為1000.
       System.out.println("Result = "+ Counter.get());
    }
}