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
廣告