2015-06-19 13 views
6

Tôi có sau đây trong lớp học của tôi:Gọi getter đơn giản trên hoạt động nguyên tử biến thiên biến động?

private static volatile byte counter = 0; 
public static byte getCounter() {return counter;} 

là cuộc gọi đến getCounter nguyên tử, hay không?

+0

Yes. Thatz mục đích dễ bay hơi. Tò mò để xem liệu sự hiểu biết của tôi có đúng hay không .... –

+2

Thực ra, mục đích của biến động là để đảm bảo rằng bất kỳ việc ghi nào bằng một luồng tới biến dễ bay hơi sẽ được hiển thị bằng các lần đọc tiếp theo bởi các luồng khác. Đọc/gán một byte là nguyên tử, có hoặc không có biến động. –

+3

Xin lưu ý rằng lý do này không giữ với 'long' và' double' –

Trả lời

10

Có, nó là một hoạt động nguyên tử, theo nghĩa là không thể sắp xếp lại hoặc định thời gian sẽ làm cho byte được đọc khi được viết một phần. Nếu byte được gán lại trong khi nó đang được đọc thì getter được đảm bảo trả lại giá trị trước hoặc sau, nhưng không có giá trị khác, thậm chí không có volatile.

Tuy nhiên, bạn phảivolatile trên một giá trị gấp đôi hoặc dài để tránh bị phù hợp đọc nhưng không phải là người già cũng không phải là giá trị mới:

Theo mục đích của mô hình bộ nhớ ngôn ngữ lập trình Java, một ghi duy nhất cho một giá trị dài hoặc không bay hơi được coi là hai ghi riêng biệt: một cho mỗi nửa 32 bit. Điều này có thể dẫn đến tình huống trong đó một luồng thấy 32 bit đầu tiên của giá trị 64 bit từ một ghi và 32 bit thứ hai từ một lần ghi khác.

Việc triển khai Máy ảo Java được khuyến khích để tránh phân tách các giá trị 64 bit nếu có thể. Các lập trình viên được khuyến khích khai báo các giá trị 64 bit được chia sẻ là volatile hoặc đồng bộ hóa các chương trình của chúng một cách chính xác để tránh các biến chứng có thể xảy ra.

Nguồn: JLS8 section 17.7

+1

@RealSkeptic Phải, tôi không bắt được từ khóa 'volatile' trong bài viết của OP. – hexafraction

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