1. 程式人生 > >Oracle官方併發教程之原子變數

Oracle官方併發教程之原子變數

原文地址譯文地址 ,譯者:李任,校對:鄭旭東

java.util.concurrent.atomic包定義了對單一變數進行原子操作的類。所有的類都提供了get和set方法,可以使用它們像讀寫volatile變數一樣讀寫原子類。就是說,同一變數上的一個set操作對於任意後續的get操作存在happens-before關係。原子的compareAndSet方法也有記憶體一致性特點,就像應用到整型原子變數中的簡單原子演算法。

為了看看這個包如何使用,讓我們返回到最初用於演示執行緒干擾的Counter類:

class Counter {
    private int c = 0;
    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }
}
class SynchronizedCounter {
    private int c = 0;
    public synchronized void increment() {
        c++;
    }
    public synchronized void decrement() {
        c--;
    }
    public synchronized int value() {
        return c;
    }
}

對於這個簡單的類,同步是一種可接受的解決方案。但是對於更復雜的類,我們可能想要避免不必要同步所帶來的活躍度影響。將int替換為AtomicInteger允許我們在不進行同步的情況下阻止執行緒干擾,如

AtomicCounter

import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
    private AtomicInteger c = new AtomicInteger(0);
    public void increment() {
        c.incrementAndGet();
    }

    public void decrement() {
        c.decrementAndGet();
    }

    public int value() {
        return c.get();
    }