2012-05-03 16 views
7

widzę tego w specyfikacji Java:java zmiana kolejności i pamięć modelu

Jeśli X i Y są akcje tego samego wątku, ax jest przed rw celu programu, a następnie x dzieje przed y.

oraz tym

oryginalny kod
gwintu 1
R2 = A;
B = 1;

ważne transformacji kompilator (kompilatory mogą zmieniać kolejność instrukcji w obu nici, gdy nie ma to wpływu na wykonanie tego gwintu w izolacji)
wątku 1
B = 1;
r2 = A;

Jestem zdezorientowany z tych dwóch rzeczy.
jeśli akcja x pojawia się przed akcją y, wtedy x powinno się zdarzyć przed y. jeśli weźmiemy pod uwagę r2 = A dla xi B = 1 dla y, r2 = A powinno się zdarzyć przed B = 1. W jaki sposób może nastąpić zmiana kolejności, w jaki sposób B = 1 jest wykonywane przed r2 = A, jeśli x ma miejsce, zanim y jest prawdziwe ?.

Odpowiedz

13

Section 17.4.5 z JLS konkretnie przynosi to uwagę:

Należy zauważyć, że obecność dzieje, zanim relacji między dwoma działaniami nie musi koniecznie oznaczać, że mają się odbyć w tej kolejności w realizacji. Jeśli zmiana kolejności daje wyniki zgodne z prawną realizacją, nie jest nielegalna.

Jeśli to pomoże, wymień „dzieje-przed” z „wurfles” wszędzie w ciemno, tak że intuicja o tym, co to znaczy, nie wchodzą w grę. Spodziewasz się gwarancji, których nie ma w specyfikacji - z powodu nazwy, podejrzewam.

+0

Na podstawie tego, co mówi JLS: JIT decyduje, że * Zdarza się przed * nie jest potrzebna, jeśli nie ma zależności między dwoma zdarzeniami (jeśli są niezależne) w prawo ?. Ten akapit wskazuje na poprawne optymalizacje JIT? – TheLostMind

+0

@ TheLostMind: Cóż, albo optymalizacje JIT, albo tylko JIT nie * usuwanie * optymalizacje procesora –

+0

W takim przypadku, * ostatecznie *, a * dzieje się wcześniej * nie istnieje. Czuję w tym fragmencie * analizę ucieczki *: P – TheLostMind

Powiązane problemy