Java đảm bảo đặc điểm kỹ thuật bài tập biến nguyên thủy luôn nguyên tử (mong đợi cho long
và đôi types
.Quan hệ giữa các hướng dẫn bytecode và các hoạt động xử lý
Ngược lại, Fetch-and-Add hoạt động tương ứng với hoạt động i++
increment nổi tiếng, sẽ là phi nguyên tử . vì dẫn đến một hoạt động đọc-sửa đổi-ghi
Giả sử mã này:
public void assign(int b) {
int a = b;
}
Các tạo bytecode là:
public void assign(int);
Code:
0: iload_1
1: istore_2
2: return
Như vậy, chúng ta thấy sự phân công bao gồm hai bước (tải và lưu trữ).
Giả sử mã này:
public void assign(int b) {
int i = b++;
}
Bytecode:
public void assign(int);
Code:
0: iload_1
1: iinc 1, 1 //extra step here regarding the previous sample
4: istore_2
5: return
Biết rằng bộ vi xử lý X86 có thể (ít nhất là những người hiện đại), hoạt động hoạt động tăng nguyên tử, như đã nói:
Trong khoa học máy tính, lệnh tìm nạp và thêm CPU là lệnh đặc biệt mà modifie nguyên tử nội dung của bộ nhớ vị trí. Nó được sử dụng để thực hiện loại trừ lẫn nhau và đồng thời các thuật toán trong các hệ thống đa xử lý, một khái quát hóa các ẩn dụ.
Như vậy, câu hỏi đầu tiên: Mặc dù thực tế là bytecode đòi hỏi cả hai bước (tải và lưu trữ), không Java dựa trên thực tế là hoạt động chuyển nhượng là một hoạt động luôn luôn thực hiện nguyên tử bất kỳ kiến trúc của vi xử lý và do đó có thể đảm bảo nguyên tử vĩnh viễn (cho các bài tập nguyên thủy) trong đặc điểm kỹ thuật của nó?
Thứ hai câu hỏi: Có sai lầm khi khẳng định rằng, với bộ vi xử lý X86 rất hiện đại và không chia sẻ mã biên dịch trên kiến trúc khác nhau, không có nhu cầu ở tất cả để đồng bộ hóa các i++
hoạt động (hoặc AtomicInteger
)? Xem xét nó đã nguyên tử rồi.
Sự hiểu biết của tôi là nguyên tử của phép gán chỉ có nghĩa là istore là nguyên tử - nói cách khác trong 'a = b', có thể là' b' được đọc, sau đó bị biến đổi thành giá trị mới thì giá trị ban đầu là được gán cho 'a'. Tuy nhiên, nguyên tử đảm bảo rằng 'a' sẽ không là một kết hợp của 2 giá trị mà' b' đã giữ. – assylias
@assylias Đó là những gì tôi nghĩ, tôi đồng ý với quan điểm này :) – Mik378