Có an toàn khi sử dụng bộ định tính :volatile-mutable
với deftype
trong một chương trình một luồng không? Đây là theo dõi tới this question, this one và this one. (Đó là một câu hỏi Clojure, nhưng tôi đã thêm thẻ "Java" vì các lập trình viên Java cũng có thể có thông tin chi tiết về nó.)Rủi ro của các trường dễ bay hơi trong các bối cảnh đơn luồng?
Tôi nhận thấy rằng tôi có thể tăng hiệu suất đáng kể trong một chương trình làm việc trên bằng cách sử dụng :volatile-mutable
trường trong một deftype
chứ không phải là nguyên tử, nhưng tôi lo lắng vì docstring cho deftype
nói:
Lưu ý rõ rằng các lĩnh vực có thể thay đổi là vô cùng khó khăn để sử dụng một cách chính xác, và chỉ xuất hiện để tạo điều kiện việc xây dựng các cấu trúc cấp cao hơn, chẳng hạn như các loại tham chiếu của Clojure, trong chính Clojure . Chúng chỉ dành cho các chuyên gia - nếu ngữ nghĩa và tác động của: dễ biến đổi hoặc không thể đồng bộ hóa có thể thay đổi không ngay lập tức rõ ràng với bạn, bạn không nên sử dụng chúng.
Trong thực tế, ngữ nghĩa và tác động của :volatile-mutable
là không ngay lập tức rõ ràng đối với tôi.
Tuy nhiên, chương 6 của Clojure Lập trình, bởi Emerick, Carper, và Grand nói:
"bay hơi" ở đây có ý nghĩa tương tự như sửa đổi lĩnh vực dễ bay hơi trong Java: đọc và viết là nguyên tử và phải được thực hiện theo thứ tự chương trình; tức là, chúng không thể được sắp xếp lại bởi trình biên dịch JIT hoặc bởi CPU. Các chất dễ bay hơi do đó không đáng ngạc nhiên và an toàn chỉ - nhưng không được phối hợp và vẫn hoàn toàn mở cho các điều kiện chủng tộc.
Điều này dường như ngụ ý rằng miễn là truy cập vào một trường đơn lẻ có thể biến đổi bất thường deftype
diễn ra trong một chuỗi duy nhất, không có gì phải lo lắng đặc biệt. (Không có gì là đặc biệt, trong đó tôi vẫn phải cẩn thận về cách tôi xử lý trạng thái nếu tôi có thể sử dụng các trình tự lười biếng.) Vì vậy, nếu không có gì giới thiệu song song trong chương trình Clojure của tôi, sẽ không có nguy hiểm đặc biệt nào khi sử dụng deftype
với :volatile-mutable
.
Điều đó có đúng không? Tôi không hiểu những nguy hiểm gì?
Nếu bạn có một sợi java đơn, và 'volatile' có ý nghĩa tương tự như java của biến động - bạn không cần phải 'volatile' ở tất cả. – ZhongYu
atomicity là một vấn đề khác. bạn có thể có các vấn đề tương tranh ngay cả với một chuỗi. Nhưng tôi không quen với Clojure nên tôi không thể bình luận. – ZhongYu
bayou.io: Từ khóa dễ bay hơi cũng thực thi rằng thứ tự chương trình của các cuộc gọi trên các biến biến động không thể được sắp xếp lại. Điều đó có thể có một số sử dụng trong một số trường hợp, tuy nhiên tôi không thể nghĩ ra một. –