前言

在多線程環境下,變數的競爭問題是常見的挑戰。AtomicInteger 提供了原子操作的解決方案,這篇文章介紹它的用法與常用方法。

AtomicInteger 介紹

AtomicIntegerjava.util.concurrent.atomic 包下的其中一個 class,它提供了一個原子操作的 Integer。也就是說它可以在多線程環境下進行安全的操作,可以避免多線程環境變數的競爭問題。

常用方法

get()

get() 方法可以取得目前的值。

AtomicInteger atomicInteger = new AtomicInteger(0); // 這邊可以預設初始值
int value = atomicInteger.get(); // 0

set()

set() 方法可以設定目前的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
atomicInteger.set(1);
int value = atomicInteger.get(); // 1

getAndSet()

getAndSet() 方法可以取得目前的值,並且設定新的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.getAndSet(1); // 因為先取後加,所以為 0
value = atomicInteger.get(); // 再取一次為 1

incrementAndGet()

incrementAndGet() 方法可以將目前的值加 1,並且回傳新的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.incrementAndGet(); // 1
value = atomicInteger.get(); // 再取一次為 1

decrementAndGet()

decrementAndGet() 方法可以將目前的值減 1,並且回傳新的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.decrementAndGet(); // -1
value = atomicInteger.get(); // 再取一次為 -1

getAndIncrement()

getAndIncrement() 方法可以先取得目前的值,並且將目前的值加 1。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.getAndIncrement(); // 0
value = atomicInteger.get(); // 再取一次為 1

getAndDecrement()

getAndDecrement() 方法可以先取得目前的值,並且將目前的值減 1。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.getAndDecrement(); // 0
value = atomicInteger.get(); // 再取一次為 -1

addAndGet()

addAndGet() 方法可以將目前的值加上指定的值,並且回傳新的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.addAndGet(2); // 2
value = atomicInteger.get(); // 再取一次為 2

getAndAdd()

getAndAdd() 方法可以先取得目前的值,並且將目前的值加上指定的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
int value = atomicInteger.getAndAdd(2); // 0
value = atomicInteger.get(); // 再取一次為 2

compareAndSet()

compareAndSet() 方法可以比較目前的值是否等於指定的值,如果相等就設定新的值。

AtomicInteger atomicInteger = new AtomicInteger(0);
boolean result = atomicInteger.compareAndSet(0, 1); // true
int value = atomicInteger.get(); // 1

總結

AtomicInteger 提供了線程安全的整數操作,在多線程環境下非常實用。掌握這些方法可以有效避免競爭條件,提升程式的穩定性。