2009-02-05 29 views
20

Đọc và viết một biến duy nhất là nguyên tử (đảm bảo ngôn ngữ!), Trừ khi biến có loại dài hoặc gấp đôi.Viết dài và gấp đôi không phải là nguyên tử trong Java?

Tôi đã đọc các trang trình bày của khóa học và tôi đã tìm thấy bài viết đó. Lớp học về đồng thời.

Bất cứ ai có thể giải thích cho tôi tại sao viết dài hay gấp đôi không phải là một hoạt động nguyên tử? Nó thực sự khiến tôi ngạc nhiên.

+0

1.) Ngôn ngữ/môi trường nào? 2.) Liên kết bạn đăng được bảo vệ bằng mật khẩu –

+0

oh sry: S firefox đang lưu trữ mật khẩu hoàn toàn quên nó – fmsf

+0

và nó nói rằng ngôn ngữ độc lập – fmsf

Trả lời

28

Nó không phải là nguyên tử vì nó là một hoạt động nhiều bước ở cấp mã máy. Đó là, longs và đôi dài hơn độ dài từ của bộ vi xử lý.

+3

Phải. Và trên một máy tính 64 bit với độ dài 64 bit, việc viết lâu có lẽ * sẽ * là nguyên tử, trừ khi bạn đang nói về một JVM hoặc một cái gì đó. –

+0

trong một máy 64 dài sẽ có 128 bit như int đã là 64 – fmsf

+7

Phụ thuộc vào langauge tôi đoán. Tôi khá chắc chắn rằng các kiểu nguyên thủy của Java được đảm bảo là một chiều dài cụ thể trên tất cả các máy. –

23

Chỉ cần làm rõ tình hình cho Java, tăng gấp đôi và chờ đợi không được đọc hoặc ghi vào nguyên tử trừ khi chúng được khai báo volatile

JLS - Nonatomic Treatment of double and long

+5

các hoạt động này là nguyên tử trong JVM 64 bit, đó là tiêu chuẩn ngày nay –

+3

Chỉ để sao lưu Amrish, tôi đã xem một bài thuyết trình (thảo luận bảng) có Cliff Click và Doug Lea và điểm được Cliff tạo ra là gấp đôi và dài hiệu quả nguyên tử trên JVM 64 bit. Vì vậy, có mô hình Bộ nhớ Java cho biết chúng tôi nghiêm chỉnh cần dễ bay hơi cho các op nguyên tử trong thời gian dài nhưng trên JVM 64 bit không phải là trường hợp. –

+3

@AmrishPandey * các hoạt động này là nguyên tử trong JVM 64 bit *, bạn có vui lòng chia sẻ liên kết giả mạo hoặc đọc thêm url không? – roottraveller

2
mô hình bộ nhớ ngôn ngữ

lập trình Java, một ghi duy nhất để một phi giá trị bay hơi hoặc dài gấp đô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.

+0

Nó ** có thể là hai ghi riêng biệt. – Pacerier

1

đọc câu trả lời bằng maaartinus @What operations in Java are considered atomic?
đọc câu trả lời của Jon Skeet @When primitive datatypes not thread-safe in Java?

Theo JLS bạn có thể làm cho đọc và ghi hoạt động trên đôi và dài là nguyên tử bằng cách tuyên bố nó như là không ổn định. Nhưng điều này sẽ không đảm bảo ++ là nguyên tử. Điều đó cần gói concurrent.atomic.
Đọc này answer từ Louis Wasserman.

Ngoài ra điều này blog và nhận xét.

1

Java dài và đôi không phải là nguyên tử trong các máy 32 bit, nhưng nguyên tử trong các máy 64 bit với một số các JVM 64 bit. tại sao nó phụ thuộc vào độ dài bit của máy? Bởi vì máy 32 bit cần hai ghi cho dài (miễn là 64 bit). Đọc this để biết thông tin chi tiết.

0

Nhiều lập trình viên phải đọc tuyên bố này trong "3.1.2. Hoạt động 64 bit không tự động" trong đồng thời java trong thực tế. Tôi đã đặt lại JLS https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.7 mới nhất. Họ vẫn không có nơi nào cho rằng 64 bit jVM là tiêu chuẩn trong những ngày này. Vì vậy, các hoạt động 64 bit được chia thành các hoạt động 32 bit phá vỡ nguyên tử và nguy hiểm để sử dụng trong môi trường đa luồng cho đến khi được khai báo dễ bay hơi. Dài và đôi dài 64 bit trong java. Vì vậy, các hoạt động viết và đọc không phải là nguyên tử trong java.

+0

Vui lòng chỉnh sửa câu trả lời của bạn đúng cách. –

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