Tôi đang cố gắng hiểu cách đa luồng hoạt động trong Java. Tôi hiểu sự khác biệt giữa Volatile
và Synchronization
.Chủ đề Java: Tất cả các biến được chia sẻ có dễ bay hơi không?
Volatile
là về khả năng hiển thị và không đảm bảo đồng bộ hóa. Khi chúng ta đang làm việc với các môi trường đa luồng, mỗi luồng tạo ra bản sao riêng của nó trên một bộ đệm cục bộ của biến mà chúng đang xử lý. Khi giá trị này đang được cập nhật, bản cập nhật sẽ xảy ra đầu tiên trong bản sao lưu cục bộ, chứ không phải trong biến thực. Do đó, các chủ đề khác là không thuyết phục về các giá trị mà các luồng khác đang thay đổi. Và đây là nơi volatile
xuất hiện trong ảnh. Các trường dễ bay hơi được ghi ngay lập tức thông qua bộ nhớ chính và các lần đọc xuất hiện từ bộ nhớ chính.
Snippet từ Thinking In Java
-
Đồng bộ hóa cũng gây đỏ bừng chuyển sang bộ nhớ chính, vì vậy nếu một lĩnh vực là hoàn toàn được bảo vệ bằng các phương pháp đồng bộ hoặc các khối, nó không là cần thiết để làm cho nó dễ bay hơi.
Thông thường chỉ an toàn khi sử dụng biến động thay vì đồng bộ hóa nếu lớp chỉ có một trường có thể thay đổi. Một lần nữa, lựa chọn đầu tiên của bạn nên là sử dụng từ khóa được đồng bộ hóa — đó là cách tiếp cận an toàn nhất và cố gắng làm bất kỳ điều gì khác là nguy hiểm.
Nhưng câu hỏi của tôi là, nếu trong một khối được đồng bộ hóa, biến chia sẻ không dễ bay hơi đang được sửa đổi, các chủ đề khác có thấy dữ liệu cập nhật không? (Vì biến được đề cập là không dễ bay hơi, các chủ đề khác nên đọc dữ liệu cũ từ bộ nhớ cache thay vì bộ nhớ chính chính)
Nếu câu trả lời cho câu hỏi trên là NO
, thì tôi có thể kết luận rằng mỗi khi sử dụng đồng bộ hóa, tôi nên đảm bảo rằng các biến được chia sẻ phải được đánh dấu volatile
?
Và nếu câu trả lời là YES
thì điều đó có nghĩa là tôi luôn có thể sử dụng synchronization
thay vì đánh dấu các biến được chia sẻ là volatile
?
p.s: Trước khi đặt câu hỏi này, tôi đã đọc qua rất nhiều câu trả lời trên StackOverflow và trên các trang web khác, nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi của mình.
@Sotirios: Tôi chắc chắn rằng câu hỏi của tôi không phải là bản sao của điều này: https://stackoverflow.com/questions/3214938/java-volatile-modifier-and-synchronized-blocks Tôi đang tìm kiếm điều gì đó khác hơn sự khác biệt giữa dễ bay hơi và đồng bộ hóa. Dù sao nhờ liên kết, tôi sẽ đọc qua các câu trả lời. –
_difference_ là gì? Bạn hỏi bạn có cần đánh dấu một biến là 'volatile' nếu bạn chỉ truy cập nó thông qua một khối' synchronized'. Các câu trả lời trong câu hỏi đó giải quyết vấn đề đó. –