Java Concurrency 简明教程

Java Concurrency - AtomicLongArray Class

java.util.concurrent.atomic.AtomicLongArray 类提供了可在底层长数组进行原子读取和写入的操作,还包含一些高级原子操作。AtomicLongArray 支持对底层 long 数组变量的原子操作。它有类似于对 volatile 变量进行读写操作的 get 和 set 方法。这意味着 set 与对同一变量的任何后续 get 具有先发生后发生关系。atomic compareAndSet 方法也有这些内存一致性特性。

A java.util.concurrent.atomic.AtomicLongArray class provides operations on underlying long array that can be read and written atomically, and also contains advanced atomic operations. AtomicLongArray supports atomic operations on underlying long array variable. It have get and set methods that work like reads and writes on volatile variables. That is, a set has a happens-before relationship with any subsequent get on the same variable. The atomic compareAndSet method also has these memory consistency features.

AtomicLongArray Methods

以下是 AtomicLongArray 类中提供的一些重要方法。

Following is the list of important methods available in the AtomicLongArray class.

Sr.No.

Method & Description

1

public long addAndGet(int i, long delta) Atomically adds the given value to the element at index i.

2

public boolean compareAndSet(int i, long expect, long update) Atomically sets the element at position i to the given updated value if the current value == the expected value.

3

public long decrementAndGet(int i) Atomically decrements by one the element at index i.

4

public long get(int i) Gets the current value at position i.

5

public long getAndAdd(int i, long delta) Atomically adds the given value to the element at index i.

6

public long getAndDecrement(int i) Atomically decrements by one the element at index i.

7

public long getAndIncrement(int i) Atomically increments by one the element at index i.

8

public long getAndSet(int i, long newValue) Atomically sets the element at position i to the given value and returns the old value.

9

public long incrementAndGet(int i) Atomically increments by one the element at index i.

10

public void lazySet(int i, long newValue) Eventually sets the element at position i to the given value.

11

public int length() Returns the length of the array.

12

public void set(int i, long newValue) Sets the element at position i to the given value.

13

public String toString() Returns the String representation of the current values of array.

14

public boolean weakCompareAndSet(int i, long expect, long update) Atomically sets the element at position i to the given updated value if the current value == the expected value.

Example

以下 TestThread 程序演示了在基于线程的环境中使用 AtomicIntegerArray 变量。

The following TestThread program shows usage of AtomicIntegerArray variable in thread based environment.

import java.util.concurrent.atomic.AtomicLongArray;

public class TestThread {
   private static AtomicLongArray atomicLongArray = new AtomicLongArray(10);

   public static void main(final String[] arguments) throws InterruptedException {

      for (int i = 0; i<atomicLongArray.length(); i++) {
         atomicLongArray.set(i, 1);
      }

      Thread t1 = new Thread(new Increment());
      Thread t2 = new Thread(new Compare());
      t1.start();
      t2.start();

      t1.join();
      t2.join();

      System.out.println("Values: ");

      for (int i = 0; i<atomicLongArray.length(); i++) {
         System.out.print(atomicLongArray.get(i) + " ");
      }
   }

   static class Increment implements Runnable {

      public void run() {

         for(int i = 0; i<atomicLongArray.length(); i++) {
            long add = atomicLongArray.incrementAndGet(i);
            System.out.println("Thread " + Thread.currentThread().getId()
               + ", index " +i + ", value: "+ add);
         }
      }
   }

   static class Compare implements Runnable {

      public void run() {

         for(int i = 0; i<atomicLongArray.length(); i++) {
            boolean swapped = atomicLongArray.compareAndSet(i, 2, 3);

            if(swapped) {
               System.out.println("Thread " + Thread.currentThread().getId()
                  + ", index " +i + ", value: 3");
            }
         }
      }
   }
}

这将产生以下结果。

This will produce the following result.

Output

Thread 9, index 0, value: 2
Thread 10, index 0, value: 3
Thread 9, index 1, value: 2
Thread 9, index 2, value: 2
Thread 9, index 3, value: 2
Thread 9, index 4, value: 2
Thread 10, index 1, value: 3
Thread 9, index 5, value: 2
Thread 10, index 2, value: 3
Thread 9, index 6, value: 2
Thread 10, index 3, value: 3
Thread 9, index 7, value: 2
Thread 10, index 4, value: 3
Thread 9, index 8, value: 2
Thread 9, index 9, value: 2
Thread 10, index 5, value: 3
Thread 10, index 6, value: 3
Thread 10, index 7, value: 3
Thread 10, index 8, value: 3
Thread 10, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3