Java Concurrency - Lớp AtomicIntegerArray
Một lớp java.util.concurrent.atomic.AtomicIntegerArray cung cấp các phép toán trên mảng int 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. AtomicIntegerArray hỗ trợ các hoạt động nguyên tử trên biến mảng int 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 AtomicIntegerArray
Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp AtomicIntegerArray.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public int addAndGet(int i, int delta) Nguyên tử thêm giá trị đã cho vào phần tử ở chỉ số i. |
2 | public boolean compareAndSet(int i, int expect, int 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 int decrementAndGet(int i) Nguyên tử giảm một phần tử ở chỉ số i. |
4 | public int get(int i) Nhận giá trị hiện tại ở vị trí i. |
5 | public int getAndAdd(int i, int delta) Nguyên tử thêm giá trị đã cho vào phần tử ở chỉ số i. |
6 | public int getAndDecrement(int i) Nguyên tử giảm một phần tử ở chỉ số i. |
7 | public int getAndIncrement(int i) Nguyên tử tăng một phần tử ở chỉ số i. |
số 8 | public int getAndSet(int i, int newValue) Đặt nguyên tử phần tử ở vị trí i thành giá trị đã cho và trả về giá trị cũ. |
9 | public int incrementAndGet(int i) Nguyên tử tăng một phần tử ở chỉ số i. |
10 | public void lazySet(int i, int 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, int 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, int expect, int 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.AtomicIntegerArray;
public class TestThread {
private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);
public static void main(final String[] arguments) throws InterruptedException {
for (int i = 0; i<atomicIntegerArray.length(); i++) {
atomicIntegerArray.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<atomicIntegerArray.length(); i++) {
System.out.print(atomicIntegerArray.get(i) + " ");
}
}
static class Increment implements Runnable {
public void run() {
for(int i = 0; i<atomicIntegerArray.length(); i++) {
int add = atomicIntegerArray.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<atomicIntegerArray.length(); i++) {
boolean swapped = atomicIntegerArray.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 10, index 0, value: 2
Thread 10, index 1, value: 2
Thread 10, index 2, value: 2
Thread 11, index 0, value: 3
Thread 10, index 3, value: 2
Thread 11, index 1, value: 3
Thread 11, index 2, value: 3
Thread 10, index 4, value: 2
Thread 11, index 3, value: 3
Thread 10, index 5, value: 2
Thread 10, index 6, value: 2
Thread 11, index 4, value: 3
Thread 10, index 7, value: 2
Thread 11, index 5, value: 3
Thread 10, index 8, value: 2
Thread 11, index 6, value: 3
Thread 10, index 9, value: 2
Thread 11, index 7, value: 3
Thread 11, index 8, value: 3
Thread 11, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3