Tôi hiểu rằng đối với loại nguyên thủy, dễ bay hơi có thể phản ánh những thay đổi giá trị từ một thread ngay
Bạn hiểu sai trong ít nhất ba cách. Bạn không nên cố gắng sử dụng dễ bay hơi cho đến khi bạn hiểu rõ hơn mọi thứ về các kiểu bộ nhớ yếu, có được và giải phóng ngữ nghĩa và cách chúng ảnh hưởng đến chương trình của bạn.
Trước hết, hãy rõ ràng là dễ bay hơi ảnh hưởng đến biến, không phải giá trị.
Thứ hai, dễ bay hơi không ảnh hưởng đến các biến chứa giá trị của các loại giá trị khác với các biến có ảnh hưởng đến các biến chứa tham chiếu.
Thứ ba, dễ bay hơi không có nghĩa là thay đổi giá trị từ các chủ đề khác được hiển thị ngay lập tức. Dễ bay hơi có nghĩa là các biến có có được và phát hành ngữ nghĩa. Biến động ảnh hưởng đến thứ tự trong đó các tác dụng phụ của đột biến bộ nhớ có thể được quan sát xảy ra từ một chủ đề cụ thể.Ý tưởng cho rằng tồn tại một trật tự phổ biến nhất quán của các đột biến và những đột biến đó theo thứ tự có thể được quan sát ngay lập tức từ tất cả các luồng không phải là một sự đảm bảo được thực hiện bởi mô hình bộ nhớ.
Tuy nhiên, nội dung của đối tượng thì sao?
Điều gì về nó? Vị trí lưu trữ được đề cập bởi một biến biến động của kiểu tham chiếu không cần phải có bất kỳ đặc tính luồng đặc biệt nào.
Nếu một chuỗi gọi hàm AddValue, địa chỉ của danh sách không thay đổi, một chuỗi khác sẽ được cập nhật về thay đổi "nội dung" của danh sách.
Không. Tại sao nó? Chủ đề khác có thể nằm trên một bộ xử lý khác và bộ nhớ cache của bộ xử lý đó có thể đã tải trước trang chứa địa chỉ của mảng đang sao lưu danh sách. Việc tắt danh sách có thể đã thay đổi vị trí lưu trữ chứa địa chỉ của mảng để tham chiếu đến một số vị trí hoàn toàn khác.
Tất nhiên, lớp danh sách không phải là chủ đề an toàn ngay từ đầu. Nếu bạn không khóa truy cập vào danh sách thì danh sách có thể chỉ đơn giản là sụp đổ và chết khi bạn cố gắng làm điều này.
Bạn không cần dễ bay hơi; những gì bạn cần là để đưa khóa chuỗi xung quanh quyền truy cập vào danh sách. Kể từ khi khóa sợi tạo ra hàng rào đầy đủ, bạn không nên cần một nửa hàng rào được giới thiệu bởi dễ bay hơi.
Tôi không chắc chắn về điều này, nhưng tôi đoán là danh sách đó thực sự chỉ là một con trỏ (địa chỉ), khi nội dung được cập nhật nó ngay lập tức được phản ánh ở mọi nơi, vì nội dung sẽ nằm trong heap, thay đổi địa chỉ ngăn xếp được thay đổi, và tôi nghĩ rằng có thể cư trú trên một lõi đơn. Nhưng, như đã nói, không có chuyên gia. Nó chỉ là một dự đoán. – Alxandr
Ngoài ra, như một lưu ý phụ. biến động dễ bay hơi của rất nhiều tối ưu hóa. Rất nhiều tối ưu hóa. Một số người không nên sử dụng các công cụ sửa đổi dễ bay hơi, mà chỉ sử dụng volatileread và volatilewrite khi cần (một số phương thức tĩnh toàn cục được tìm thấy trên một lớp trong không gian tên hệ thống, có thể được tìm thấy trên google). – Alxandr
@Alxandr: Hãy cẩn thận. Đọc dễ bay hơi và viết dễ bay hơi là các phương thức đắt tiền có khả năng để gọi và chúng tạo ra * hàng rào đầy đủ *, không phải là hàng rào nửa mà người ta mong đợi. Nếu bạn đang viết mã không có khóa vì lý do hiệu suất (và lý do nào khác bạn phải làm điều điên rồ này?) Hoàn toàn có thể là VolatileRead và VolatileWrite tệ hơn. Bạn phải ghi lại cẩn thận. –