Từ khóa volatile
trong Java là một công cụ quan trọng trong việc điều phối truy cập vào biến giữa các luồng (threads). Nó giúp đảm bảo rằng các thay đổi đối với biến được nhìn thấy ngay lập tức bởi các luồng khác, giảm thiểu vấn đề đồng bộ hóa khi nhiều luồng cần truy cập và sửa đổi một biến chia sẻ. Bài viết này sẽ trình bày chi tiết về từ khóa volatile
, cách thức hoạt động của nó, và những lưu ý khi sử dụng.
Từ khóa volatile
được sử dụng để khai báo một biến trong Java mà có thể được truy cập và thay đổi bởi nhiều luồng khác nhau. Khi một biến được khai báo là volatile
, Java đảm bảo rằng:
Khi một luồng ghi giá trị cho một biến volatile
, giá trị đó được ghi ngay vào bộ nhớ chính. Bất kỳ luồng nào khác đọc giá trị của biến đó sẽ luôn thấy giá trị mới nhất.
volatile
cũng giúp đảm bảo rằng không có luồng nào có thể nhìn thấy trạng thái không đồng bộ của biến. Điều này có nghĩa là:
volatile
, và sau đó luồng khác đọc biến đó, luồng đọc sẽ nhận được giá trị đã được cập nhật.volatile
sẽ luôn được nhìn thấy bởi tất cả các luồng.Dưới đây là một ví dụ đơn giản về cách sử dụng từ khóa volatile
:
public class VolatileExample { private volatile boolean running = true; public void run() { while (running) { // Thực hiện một số tác vụ } } public void stop() { running = false; // Cập nhật giá trị biến volatile } public static void main(String[] args) throws InterruptedException { VolatileExample example = new VolatileExample(); Thread thread = new Thread(example::run); thread.start(); // Đợi 1 giây trước khi dừng Thread.sleep(1000); example.stop(); // Ghi giá trị false vào biến volatile thread.join(); // Chờ luồng hoàn thành } }
Trong ví dụ trên, biến running
được khai báo là volatile
. Khi phương thức stop()
được gọi, giá trị của running
được cập nhật thành false
, và điều này ngay lập tức được nhìn thấy bởi luồng đang thực hiện phương thức run()
.
volatile
không thể thay thế cho synchronized trong trường hợp các biến phụ thuộc vào nhau hoặc có các thao tác phức tạp hơn.volatile
không phù hợp cho các biến phức tạp hoặc khi bạn cần kiểm tra và cập nhật nhiều giá trị một cách đồng thời.Từ khóa volatile
trong Java là một công cụ hữu ích để đồng bộ hóa truy cập vào các biến chia sẻ giữa nhiều luồng. Nó đảm bảo rằng mọi thay đổi đối với biến volatile
đều được nhìn thấy ngay lập tức bởi tất cả các luồng, giảm thiểu vấn đề đồng bộ hóa. Tuy nhiên, volatile
không thay thế cho các cơ chế đồng bộ hóa phức tạp hơn, như synchronized
, và nên được sử dụng một cách thận trọng.