Java: Biến atomic

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Gói java.util.concurrent.atomic định nghĩa các lớp hỗ trợ các hoạt động atomic trên các biến đơn. Tất cả các lớp đều có các phương thức get và set để làm việc giống như các hoạt động đọc và ghi trên các biến volatile. Cụ thể, mỗi phương thức set có một quan hệ happens-before với một phương thức get bất kỳ trên cùng một biến. Phương thức atomic compareAndSet cũng có những đặc điểm nhất quán bộ nhớ như vậy. method also has these memory consistency features, as do the simple atomic arithmetic methods that apply to integer atomic variables.

Để tìm hiểu cách sử dụng gói này, chúng ta xét lớp Counter dưới đây:

class Counter {
    private int c = 0;

    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }

}

Một cách để lớp Counter có thể trở nên an toàn hơn trong vấn đề giao thoa luồng là đồng bộ hóa các phương thức của nó, điều này được thể hiện ở lớp SynchronizedCounter dưới đây:

class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }

}

Trong lớp trên, sự đồng bộ hóa là một giải pháp có thể chấp nhận được. Nhưng đối với một lớp phức tạp hơn thì chúng ta có thể muốn tránh được tác động liveness của sự đồng bộ hóa. Việc thay thay thế trường kiểu int bằng một  AtomicInteger sẽ cho phép ta ngăn chặn được giao thoa luồng mà không cần đến đồng bộ hóa, điều này được thể hiện ởi lớp AtomicCounter dưới đây:

import java.util.concurrent.atomic.AtomicInteger;

class AtomicCounter {
    private AtomicInteger c = new AtomicInteger(0);

    public void increment() {
        c.incrementAndGet();
    }

    public void decrement() {
        c.decrementAndGet();
    }

    public int value() {
        return c.get();
    }

}

» Tiếp: Số ngẫu nhiên đồng thời
« Trước: Gói concurrent
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!