Java Concurrency - Lớp AtomicBoolean
Lớp java.util.concurrent.atomic.AtomicBoolean cung cấp các phép toán trên giá trị boolean cơ bản 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. AtomicBoolean hỗ trợ các hoạt động nguyên tử trên biến boolean cơ bản. 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 pháp AtomicBoolean
Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp AtomicBoolean.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public boolean compareAndSet(boolean expect, boolean update) Đặt nguyên tử giá trị thành giá trị cập nhật nhất định nếu giá trị hiện tại == giá trị mong đợi. |
2 | public boolean get() Trả về giá trị hiện tại. |
3 | public boolean getAndSet(boolean newValue) Đặt nguyên tử thành giá trị đã cho và trả về giá trị trước đó. |
4 | public void lazySet(boolean newValue) Cuối cùng đặt thành giá trị đã cho. |
5 | public void set(boolean newValue) Đặt vô điều kiện đến giá trị đã cho. |
6 | public String toString() Trả về biểu diễn chuỗi của giá trị hiện tại. |
7 | public boolean weakCompareAndSet(boolean expect, boolean update) Đặt nguyên tử giá trị thành giá trị cập nhật nhất định 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 AtomicBoolean trong môi trường dựa trên luồng.
import java.util.concurrent.atomic.AtomicBoolean;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
new Thread("Thread 1") {
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName()
+" Waiting for Thread 2 to set Atomic variable to true. Current value is "
+ atomicBoolean.get());
if(atomicBoolean.compareAndSet(true, false)) {
System.out.println("Done!");
break;
}
}
};
}.start();
new Thread("Thread 2") {
public void run() {
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
System.out.println(Thread.currentThread().getName() +
" is setting the variable to true ");
atomicBoolean.set(true);
System.out.println(Thread.currentThread().getName() +
", Atomic Variable: " +atomicBoolean.get());
};
}.start();
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2, Atomic Variable: false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2 is setting the variable to true
Thread 2, Atomic Variable: true
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Done!