Mô hình bộ nhớ java yêu cầu viết int
là nguyên tử: Tức là, nếu bạn viết giá trị cho nó (bao gồm 4 byte) trong một luồng và đọc nó trong một chuỗi khác, bạn sẽ nhận được tất cả các byte hoặc không có, nhưng không bao giờ 2 byte mới và 2 byte cũ hoặc như vậy.Viết một tham chiếu nguyên tử trên các máy ảo 64 bit
Điều này không được đảm bảo cho long
. Ở đây, viết 0x1122334455667788
vào một biến giữ 0
trước khi có thể dẫn đến một chuỗi khác đọc 0x112233440000000
hoặc 0x0000000055667788
.
Hiện tại, đặc điểm kỹ thuật không yêu cầu tham chiếu đối tượng là int hoặc dài. Vì lý do an toàn loại, tôi nghi ngờ rằng chúng được đảm bảo bằng văn bản về mặt nguyên tử, nhưng trên máy ảo 64 bit, các tham chiếu này có thể là các giá trị 64 bit (chỉ là địa chỉ bộ nhớ).
Bây giờ đây là những câu hỏi của tôi:
- Có bất kỳ thông số kỹ thuật mô hình bộ nhớ bao gồm này (mà tôi đã không tìm thấy)?
- Nghi ngờ viết lâu là nguyên tử trên máy ảo 64 bit?
- Máy ảo có bị buộc phải ánh xạ tham chiếu đến 32 bit không?
Kính trọng, Steffen
@Steffen Heil: soi mói nhưng lưu ý rằng không phải tất cả tài liệu tham khảo là 64 bit trong nội bộ thậm chí trên 64 bit VM (do số lượng đáng kinh ngạc của sự lãng phí 64 bit tài liệu tham khảo được tạo ra).Các máy ảo hiện đại đang sử dụng nén con trỏ/nén tham chiếu có tên * "CompressedOops" *: http://wikis.sun.com/display/HotSpotInternals/CompressedOops Vì vậy, tôi không đồng ý rằng chúng * có thể * có giá trị 64 bit nhưng chúng thường 't (không phải là nó thay đổi nhiều đến câu trả lời mà Dirk đăng). – SyntaxT3rr0r