Chúng tôi đã bắt đầu cấm sử dụng volatile
trong nguồn của chúng tôi vì rất dễ viết mã không phải lúc nào cũng hoạt động như mong đợi.
Theo kinh nghiệm của tôi, mọi người thêm dễ bay hơi để chia sẻ giá trị giữa các chuỗi. Và sau đó, người khác bắt đầu sửa đổi giá trị. Và hầu hết thời gian, điều này hoạt động. Nhưng trong sản xuất, bạn bắt đầu nhận được các lỗi kỳ lạ mà thực sự khó để theo dõi. Các bộ đếm được tăng lên 100'000 lần (các phép thử chỉ tăng lên 10 lần) nhưng kết thúc ở mức 99'997. Trong Java 1.4, các giá trị dài có thể bị hỏng thực sự, rất hiếm khi.
Các lớp trợ giúp Atomic*
, mặt khác, chỉ áp đặt một chi phí nhỏ và chúng luôn hoạt động như được quảng cáo.
Vì vậy, trừ khi bạn có lý do chính đáng (*) để sử dụng volatile
, luôn thích các lớp trợ giúp Atomic*
.
Nếu bạn không biết chính xác từng ký tự trong lớp trợ giúp Atomic*
, thì bạn thực sự nên tránh volatile
.
*: Tối ưu hóa sớm không bao giờ là lý do chính đáng.
Nguồn
2012-10-12 12:43:36
Vì người ta đã đề cập đến nó (không phải ở đây cũng không trùng lặp): w/Các lớp nguyên tử bạn có một phương thức tiện lợi lazySet. Trên hầu hết các kiến trúc, nó hoạt động tốt hơn viết cơ bản dễ bay hơi (nhưng nó không có cùng ngữ nghĩa). Về cơ bản lazySet không cần phải tuôn ra các bộ đệm ghi CPU mà là khá tốt vì chúng có thể được flushed trong khi CPU bị đình trệ. – bestsss