2012-05-03 35 views
7

Tôi thấy điều này trong thông số kỹ thuật java:java sắp xếp lại và mô hình bộ nhớ

Nếu x và y là hành động của cùng một chuỗi và x đến trước y theo thứ tự chương trình, x xảy ra trước y.

và cũng

mã ban đầu
Chủ đề 1
r2 = A này;
B = 1;

chuyển đổi trình biên dịch hợp lệ (trình biên dịch được phép sắp xếp lại các hướng dẫn trong một trong hai chủ đề, khi điều này không ảnh hưởng đến việc thực hiện các chủ đề mà trong sự cô lập)
Chủ đề 1
B = 1;
r2 = A;

Tôi bối rối với hai điều đó.
nếu một hành động x đến trước một hành động y thì x sẽ xảy ra trước y. nếu chúng ta xem xét r2 = A cho x và B = 1 cho y, r2 = A sẽ xảy ra trước B = 1. Làm thế nào có thể có bất kỳ sắp xếp lại, làm thế nào đến B = 1 được thực hiện trước khi r2 = A nếu x xảy ra trước khi y là đúng ?.

Trả lời

13

Section 17.4.5 của JLS đặc biệt mang này ra:

Cần lưu ý rằng sự hiện diện của một mối quan hệ xảy ra-trước giữa hai hành động không nhất thiết có nghĩa là họ phải diễn ra theo thứ tự trong quá trình triển khai. Nếu việc sắp xếp lại tạo ra kết quả phù hợp với việc thực thi pháp lý, nó không phải là bất hợp pháp.

Nếu nó giúp, thay thế "xảy ra-trước" với "wurfles" ở khắp mọi nơi trong spec, do đó bạn trực giác về ý nghĩa của nó không đi vào chơi. Bạn đang mong đợi đảm bảo mà không có trong spec - do đặt tên, tôi nghi ngờ.

+0

Dựa trên những gì JLS nói: JIT quyết định rằng * Xảy ra trước * không cần thiết nếu không có sự phụ thuộc giữa hai sự kiện (nếu chúng độc lập) phải không ?. Đoạn này hướng đến tối ưu hóa JIT chính xác? – TheLostMind

+0

@ TheLostMind: Vâng, hoặc tối ưu hóa JIT hoặc chỉ JIT không * loại bỏ * Tối ưu hóa CPU –

+0

Trong trường hợp đó, * cuối cùng *, a * xảy ra trước * không tồn tại. Tôi ngửi thấy mùi của * phân tích thoát * trong cái này: P – TheLostMind

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