×

Volatile keyword trong Java là gì?

Trong Java, từ khóa volatile được sử dụng làm modifier cho biến, cho phép các luồng đọc giá trị của biến trực tiếp từ bộ nhớ chính thay vì từ bộ nhớ cache của CPU, đảm bảo rằng giá trị của biến được cập nhật và đọc một cách nhất quán giữa các luồng. Sử dụng volatile giúp giảm thiểu vấn đề về sự không đồng bộ của biến khi được truy cập từ nhiều luồng khác nhau, mà không cần đến synchronization.

Tính Năng của Volatile:

  1. Đảm Bảo Tính Nhìn Thấy (Visibility): Khi một biến được khai báo là volatile, bất kỳ thay đổi nào được thực hiện bởi một luồng đều sẽ ngay lập tức nhìn thấy được bởi các luồng khác. Điều này giúp đảm bảo rằng các luồng có được giá trị mới nhất của biến.

  2. Không Đảm Bảo Tính Nguyên Tố (Atomicity): volatile không giải quyết vấn đề về tính nguyên tố của các hoạt động (như tăng giá trị). Đối với các hoạt động này, bạn vẫn cần sử dụng synchronization hoặc các class hỗ trợ từ java.util.concurrent.atomic.

Khi Nào Sử Dụng Volatile?

  • Biến Trạng Thái Cờ (Flag Variables): Khi sử dụng một biến để kiểm soát trạng thái hoặc cờ điều khiển cho luồng, volatile có thể đảm bảo rằng thay đổi trạng thái được các luồng khác nhận biết một cách nhất quán.
  • Biến Đơn Giản Đọc/Ghi: Đối với các biến được nhiều luồng đọc và chỉ một luồng ghi, và các hoạt động là đơn giản (không phụ thuộc vào giá trị trước đó của biến).

Ví Dụ:

public class SharedObject {
    private volatile boolean running = true;

    public void stopRunning() {
        this.running = false;
    }

    public void startRunning() {
        while (running) {
            // Thực hiện công việc
        }
    }
}

Trong ví dụ trên, biến running được khai báo là volatile, đảm bảo rằng khi một luồng thay đổi giá trị của running sang false, thay đổi này sẽ ngay lập tức được phản ánh và nhìn thấy bởi luồng đang thực thi trong phương thức startRunning.

Lưu Ý:

Sử dụng volatile chỉ khi bạn cần đảm bảo tính nhìn thấy của giá trị giữa các luồng và các hoạt động với biến đó không yêu cầu tính nguyên tố. Trong trường hợp cần đồng bộ hoá các hoạt động phức tạp hơn trên biến, bạn nên sử dụng các cơ chế đồng bộ hóa hoặc các class trong gói java.util.concurrent.

Comments