Java Concurrency - Lớp AtomicInteger
Lớp java.util.concurrent.atomic.AtomicInteger cung cấp các phép toán trên giá trị int bên dưới có thể được đọc và viết theo nguyên tử, đồng thời cũng chứa các phép toán nguyên tử nâng cao. AtomicInteger hỗ trợ các hoạt động nguyên tử trên biến 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 AtomicInteger
Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp AtomicInteger.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public int addAndGet(int delta) Nguyên tử thêm giá trị đã cho vào giá trị hiện tại. |
2 | public boolean compareAndSet(int expect, int update) Nguyên tử đặt giá trị thành giá trị cập nhật nhất định nếu giá trị hiện tại giống với giá trị mong đợi. |
3 | public int decrementAndGet() Nguyên tử giảm một giá trị hiện tại. |
4 | public double doubleValue() Trả về giá trị của một số được chỉ định dưới dạng nhân đôi. |
5 | public float floatValue() Trả về giá trị của số đã chỉ định dưới dạng số thực. |
6 | public int get() Nhận giá trị hiện tại. |
7 | public int getAndAdd(int delta) Atomiclly thêm giá trị đã cho vào giá trị hiện tại. |
số 8 | public int getAndDecrement() Nguyên tử giảm một giá trị hiện tại. |
9 | public int getAndIncrement() Nguyên tử tăng một giá trị hiện tại. |
10 | public int getAndSet(int newValue) Đặt nguyên tử thành giá trị đã cho và trả về giá trị cũ. |
11 | public int incrementAndGet() Nguyên tử tăng một giá trị hiện tại. |
12 | public int intValue() Trả về giá trị của số được chỉ định dưới dạng int. |
13 | public void lazySet(int newValue) Cuối cùng đặt thành giá trị đã cho. |
14 | public long longValue() Trả về giá trị của số được chỉ định dưới dạng dài. |
15 | public void set(int newValue) Đặt thành giá trị đã cho. |
16 | public String toString() Trả về biểu diễn chuỗi của giá trị hiện tại. |
17 | public boolean weakCompareAndSet(int expect, int update) Nguyên tử đặt giá trị thành giá trị cập nhật nhất định nếu giá trị hiện tại giống với giá trị mong đợi. |
Thí dụ
Chương trình TestThread sau đây cho thấy việc triển khai bộ đếm không an toàn trong môi trường dựa trên luồng.
public class TestThread {
static class Counter {
private int c = 0;
public void increment() {
c++;
}
public int value() {
return c;
}
}
public static void main(final String[] arguments) throws InterruptedException {
final Counter counter = new Counter();
//1000 threads
for(int i = 0; i < 1000 ; i++) {
new Thread(new Runnable() {
public void run() {
counter.increment();
}
}).start();
}
Thread.sleep(6000);
System.out.println("Final number (should be 1000): " + counter.value());
}
}
Điều này có thể tạo ra kết quả sau tùy thuộc vào tốc độ của máy tính và sự đan xen luồng.
Đầu ra
Final number (should be 1000): 1000
Thí dụ
Chương trình TestThread sau đây cho thấy một triển khai an toàn của bộ đếm bằng cách sử dụng AtomicInteger trong môi trường dựa trên luồng.import java.util.concurrent.atomic.AtomicInteger;
public class TestThread {
static class Counter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.getAndIncrement();
}
public int value() {
return c.get();
}
}
public static void main(final String[] arguments) throws InterruptedException {
final Counter counter = new Counter();
//1000 threads
for(int i = 0; i < 1000 ; i++) {
new Thread(new Runnable() {
public void run() {
counter.increment();
}
}).start();
}
Thread.sleep(6000);
System.out.println("Final number (should be 1000): " + counter.value());
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Final number (should be 1000): 1000