2012-01-02 35 views

Trả lời

25

Sử dụng volatile để đảm bảo rằng mỗi quyền truy cập đọc vào một biến sẽ thấy giá trị mới nhất được ghi vào biến đó. Sử dụng synchronized bất cứ khi nào bạn cần giá trị ổn định cho nhiều hướng dẫn. (Lưu ý rằng điều này không nhất thiết có nghĩa nhiều câu lệnh; báo cáo kết quả duy nhất:.

var++; // NOT thread safe! 

không thread-an toàn ngay cả nếu var được khai báo volatile Bạn cần phải làm điều này:

synchronized(LOCK_OBJECT){var++;} 

Xem here để có một bản tóm tắt tốt đẹp về vấn đề này

+0

'AtomicLong' xử lý' var ++ 'với một phương thức và chỉ là trường' volatile'. Bạn có thể chỉnh sửa câu trả lời của mình để cung cấp ví dụ tốt hơn không? – Gray

+0

@Gray - OK. "Ví dụ tốt hơn" của tôi là 'var' là kiểu' float'. –

3

Đó là một câu hỏi khá rộng. Câu trả lời hay nhất tôi có thể đưa ra là sử dụng synchronized khi thực hiện nhiều hành động mà các chủ đề khác phải xem bằng cách xuất hiện nguyên tử — hoặc tất cả hoặc không có bước nào đã xảy ra.

Đối với một hành động, volatile có thể là đủ; nó hoạt động như một rào cản bộ nhớ để đảm bảo khả năng hiển thị của sự thay đổi cho các chủ đề khác.

9

Biến động chỉ đảm bảo hoạt động đọc luôn cung cấp trạng thái mới nhất từ ​​bộ nhớ qua các chủ đề. không đảm bảo bất kỳ việc viết an toàn/thứ tự các hoạt động nào, tức là hai luồng có thể cập nhật biến dễ bay hơi theo bất kỳ thứ tự ngẫu nhiên nào. Ngoài ra nó không đảm bảo rằng nhiều hoạt động trên biến là nguyên tử.

Tuy nhiên, khối đồng bộ đảm bảo trạng thái mới nhất và viết an toàn. Ngoài ra, truy cập và cập nhật biến là nguyên tử bên trong một khối được đồng bộ hóa. Ở trên, tuy nhiên là đúng, chỉ khi tất cả quyền truy cập/cập nhật cho biến được đề cập đang sử dụng cùng một đối tượng khóa để không có nhiều chủ đề truy cập vào biến.

0

Dễ bay hơi không có khóa, nó sử dụng kiến ​​trúc CPU cơ bản để đảm bảo khả năng hiển thị trên tất cả các chuỗi sau khi ghi.

Các vấn đề liên quan