- Java 併發教程
- 併發 - 首頁
- 併發 - 概述
- 併發 - 環境設定
- 併發 - 主要操作
- 執行緒間通訊
- 併發 - 同步
- 併發 - 死鎖
- 實用類示例
- 併發 - ThreadLocal
- 併發 - ThreadLocalRandom
- 鎖示例
- 併發 - Lock
- 併發 - ReadWriteLock
- 併發 - Condition
- 原子變數示例
- 併發 - AtomicInteger
- 併發 - AtomicLong
- 併發 - AtomicBoolean
- 併發 - AtomicReference
- 併發 - AtomicIntegerArray
- 併發 - AtomicLongArray
- 併發 - AtomicReferenceArray
- 執行器示例
- 併發 - Executor
- 併發 - ExecutorService
- ScheduledExecutorService
- 執行緒池示例
- 併發 - newFixedThreadPool
- 併發 - newCachedThreadPool
- newScheduledThreadPool
- newSingleThreadExecutor
- 併發 - ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- 高階示例
- 併發 - Futures 和 Callables
- 併發 - Fork-Join 框架
- 併發集合
- 併發 - BlockingQueue
- 併發 - ConcurrentMap
- ConcurrentNavigableMap
- 併發實用資源
- 併發 - 快速指南
- 併發 - 有用資源
- 併發 - 討論
Java 併發 - AtomicLong 類
java.util.concurrent.atomic.AtomicLong 類提供對底層 long 值的操作,這些操作可以原子地讀取和寫入,並且還包含高階原子操作。AtomicLong 支援對底層 long 變數的原子操作。它具有 get 和 set 方法,這些方法的工作方式類似於對 volatile 變數的讀取和寫入。也就是說,set 與隨後對同一變數的任何 get 之間存在 happens-before 關係。atomic compareAndSet 方法也具有這些記憶體一致性特性。
AtomicLong 方法
以下是 AtomicLong 類中可用的一些重要方法。
| 序號 | 方法及描述 |
|---|---|
| 1 | public long addAndGet(long delta) 原子地將給定值新增到當前值。 |
| 2 | public boolean compareAndSet(long expect, long update) 如果當前值與預期值相同,則原子地將值設定為給定的更新值。 |
| 3 | public long decrementAndGet() 原子地將當前值減 1。 |
| 4 | public double doubleValue() 將指定數字的值作為 double 返回。 |
| 5 | public float floatValue() 將指定數字的值作為 float 返回。 |
| 6 | public long get() 獲取當前值。 |
| 7 | public long getAndAdd(long delta) 原子地將給定值新增到當前值。 |
| 8 | public long getAndDecrement() 原子地將當前值減 1。 |
| 9 | public long getAndIncrement() 原子地將當前值加 1。 |
| 10 | public long getAndSet(long newValue) 原子地設定為給定值並返回舊值。 |
| 11 | public long incrementAndGet() 原子地將當前值加 1。 |
| 12 | public int intValue() 將指定數字的值作為 int 返回。 |
| 13 | public void lazySet(long newValue) 最終設定為給定值。 |
| 14 | public long longValue() 將指定數字的值作為 long 返回。 |
| 15 | public void set(long newValue) 設定為給定值。 |
| 16 | public String toString() 返回當前值的字串表示形式。 |
| 17 | public boolean weakCompareAndSet(long expect, long update) 如果當前值與預期值相同,則原子地將值設定為給定的更新值。 |
示例
以下 TestThread 程式展示了在基於執行緒的環境中使用 AtomicLong 安全實現計數器的示例。
import java.util.concurrent.atomic.AtomicLong;
public class TestThread {
static class Counter {
private AtomicLong c = new AtomicLong(0);
public void increment() {
c.getAndIncrement();
}
public long value() {
return c.get();
}
}
public static void main(final String[] arguments) throws InterruptedException {
final Counter counter = new Counter();
//1000 threads
for(int i = 0; i < 1000 ; i++) {
new Thread(new Runnable() {
public void run() {
counter.increment();
}
}).start();
}
Thread.sleep(6000);
System.out.println("Final number (should be 1000): " + counter.value());
}
}
這將產生以下結果。
輸出
Final number (should be 1000): 1000