Oracle官方併發教程之原子變數
阿新 • • 發佈:2018-12-22
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(); }