Những phép toán nào trong Java được coi là nguyên tử?
Câu trả lời:
và có thể nhiều thứ khác. Nhìn vào jls .
Như đã lưu ý trong các nhận xét, tính nguyên tử không bao hàm khả năng hiển thị. Vì vậy, trong khi một luồng khác được đảm bảo không nhìn thấy một phần được viết int
, nó có thể không bao giờ thấy giá trị mới.
Các hoạt động trên dài và gấp đôi cũng trên CPU nguyên tử 64 bit phổ biến , mặc dù không có gì đảm bảo. Xem thêm yêu cầu tính năng này .
64 bit jvm, long and double assignments are also atomic.
Bạn có chắc không? Tôi muốn nói rằng chúng dành cho mã đã biên dịch, nhưng mã được thông dịch thì sao? Có lẽ bạn đúng, nhưng có gì đảm bảo không?
Trong Java, việc đọc và ghi số lượng 32 bit hoặc nhỏ hơn được đảm bảo là nguyên tử.
Theo nguyên tử, chúng tôi có nghĩa là mỗi hành động diễn ra trong một bước và không thể bị gián đoạn. Do đó, khi chúng ta có các ứng dụng đa luồng, các hoạt động đọc và ghi là an toàn theo luồng và không cần phải đồng bộ hóa.
Ví dụ: mã sau là chuỗi an toàn:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
Có vẻ như các phép gán dài là nguyên tử, dựa trên phương pháp này trong AtomicLong.java:
public final void set(long newValue) {
value = newValue;
}
Lưu ý sự vắng mặt của bất kỳ đồng bộ hóa nào.
value
. Nó volatile
.
value
là volatile
không làm cho sự phân công của value
nguyên tử, nó chỉ đơn thuần là tránh "xuất bản" vấn đề này.
volatile
long và đôi được đảm bảo là nguyên tử: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7