Java Concurrency - Lớp AtomicLongArray

Một lớp java.util.concurrent.atomic.AtomicLongArray cung cấp các phép toán trên mảng dài bên dưới có thể đọc và viết nguyên tử, đồng thời chứa các phép toán nguyên tử nâng cao. AtomicLongArray hỗ trợ các hoạt động nguyên tử trên biến mảng dài bên dưới. Nó có các phương thức get và set hoạt động như đọc và ghi trên các biến dễ bay hơi. Nghĩa là, một tập hợp có mối quan hệ xảy ra trước với bất kỳ lần nhận nào tiếp theo trên cùng một biến. Phương thức so sánh nguyên tử cũng có các tính năng nhất quán bộ nhớ này.

Phương thức AtomicLongArray

Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp AtomicLongArray.

Sr.No. Phương pháp & Mô tả
1

public long addAndGet(int i, long delta)

Nguyên tử thêm giá trị đã cho vào phần tử ở chỉ số i.

2

public boolean compareAndSet(int i, long expect, long update)

Đặt nguyên tử phần tử ở vị trí i thành giá trị cập nhật đã cho nếu giá trị hiện tại == giá trị mong đợi.

3

public long decrementAndGet(int i)

Nguyên tử giảm một phần tử ở chỉ số i.

4

public long get(int i)

Nhận giá trị hiện tại ở vị trí i.

5

public long getAndAdd(int i, long delta)

Nguyên tử thêm giá trị đã cho vào phần tử ở chỉ số i.

6

public long getAndDecrement(int i)

Nguyên tử giảm một phần tử ở chỉ số i.

7

public long getAndIncrement(int i)

Nguyên tử tăng một phần tử ở chỉ số i.

số 8

public long getAndSet(int i, long newValue)

Đặt nguyên tử phần tử ở vị trí i thành giá trị đã cho và trả về giá trị cũ.

9

public long incrementAndGet(int i)

Nguyên tử tăng một phần tử ở chỉ số i.

10

public void lazySet(int i, long newValue)

Cuối cùng đặt phần tử ở vị trí i thành giá trị đã cho.

11

public int length()

Trả về độ dài của mảng.

12

public void set(int i, long newValue)

Đặt phần tử ở vị trí i thành giá trị đã cho.

13

public String toString()

Trả về biểu diễn chuỗi của các giá trị hiện tại của mảng.

14

public boolean weakCompareAndSet(int i, long expect, long update)

Đặt nguyên tử phần tử ở vị trí i thành giá trị cập nhật đã cho nếu giá trị hiện tại == giá trị mong đợi.

Thí dụ

Chương trình TestThread sau đây cho thấy cách sử dụng biến AtomicIntegerArray trong môi trường dựa trên luồng.

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");
            }
         }
      }
   }
}

Điều này sẽ tạo ra kết quả sau.

Đầu ra

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