Lớp AtomicReferenceArray
Lớp java.util.concurrent.atomic.AtomicReferenceArray cung cấp các hoạt động trên mảng tham chiếu bên dưới có thể được đọc và viết theo nguyên tử, đồng thời chứa các phép toán nguyên tử nâng cao. AtomicReferenceArray hỗ trợ các hoạt động nguyên tử trên biến mảng tham chiếu 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 AtomicReferenceArray
Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp AtomicReferenceArray.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public boolean compareAndSet(int i, E expect, E 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. |
2 | public E get(int i) Nhận giá trị hiện tại ở vị trí i. |
3 | public E getAndSet(int i, E newValue) Đặt nguyên tử phần tử ở vị trí i thành giá trị đã cho và trả về giá trị cũ. |
4 | public void lazySet(int i, E newValue) Cuối cùng đặt phần tử ở vị trí i thành giá trị đã cho. |
5 | public int length() Trả về độ dài của mảng. |
6 | public void set(int i, E newValue) Đặt phần tử ở vị trí i thành giá trị đã cho. |
7 | 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. |
số 8 | public boolean weakCompareAndSet(int i, E expect, E 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 AtomicReferenceArray trong môi trường dựa trên luồng.
import java.util.concurrent.atomic.AtomicReferenceArray;
public class TestThread {
private static String[] source = new String[10];
private static AtomicReferenceArray<String> atomicReferenceArray
= new AtomicReferenceArray<String>(source);
public static void main(final String[] arguments) throws InterruptedException {
for (int i = 0; i<atomicReferenceArray.length(); i++) {
atomicReferenceArray.set(i, "item-2");
}
Thread t1 = new Thread(new Increment());
Thread t2 = new Thread(new Compare());
t1.start();
t2.start();
t1.join();
t2.join();
}
static class Increment implements Runnable {
public void run() {
for(int i = 0; i<atomicReferenceArray.length(); i++) {
String add = atomicReferenceArray.getAndSet(i,"item-"+ (i+1));
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: "+ add);
}
}
}
static class Compare implements Runnable {
public void run() {
for(int i = 0; i<atomicReferenceArray.length(); i++) {
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", value: "+ atomicReferenceArray.get(i));
boolean swapped = atomicReferenceArray.compareAndSet(i, "item-2", "updated-item-2");
System.out.println("Item swapped: " + swapped);
if(swapped) {
System.out.println("Thread " + Thread.currentThread().getId()
+ ", index " +i + ", updated-item-2");
}
}
}
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Thread 9, index 0, value: item-2
Thread 10, index 0, value: item-1
Item swapped: false
Thread 10, index 1, value: item-2
Item swapped: true
Thread 9, index 1, value: updated-item-2
Thread 10, index 1, updated-item-2
Thread 10, index 2, value: item-3
Item swapped: false
Thread 10, index 3, value: item-2
Item swapped: true
Thread 10, index 3, updated-item-2
Thread 10, index 4, value: item-2
Item swapped: true
Thread 10, index 4, updated-item-2
Thread 10, index 5, value: item-2
Item swapped: true
Thread 10, index 5, updated-item-2
Thread 10, index 6, value: item-2
Thread 9, index 2, value: item-2
Item swapped: true
Thread 9, index 3, value: updated-item-2
Thread 10, index 6, updated-item-2
Thread 10, index 7, value: item-2
Thread 9, index 4, value: updated-item-2
Item swapped: true
Thread 9, index 5, value: updated-item-2
Thread 10, index 7, updated-item-2
Thread 9, index 6, value: updated-item-2
Thread 10, index 8, value: item-2
Thread 9, index 7, value: updated-item-2
Item swapped: true
Thread 9, index 8, value: updated-item-2
Thread 10, index 8, updated-item-2
Thread 9, index 9, value: item-2
Thread 10, index 9, value: item-10
Item swapped: false