Jawa, gdy mają dwa wątki dzielące następujących zmiennych:Co naprawdę robi bariera LoadLoad?
int a;
volatile int b;
jeśli gwint 1 służy:
a = 5;
b = 6;
Następnie bariera StoreStore umieszcza się pomiędzy tymi dwoma instrukcjami i „a”, to jest przepłukane z powrotem do pamięci głównej.
Teraz, jeśli nić 2 nie jest:
if(b == 6)
a++;
LoadLoad barierowa jest umieszczona pomiędzy i mieć gwarancję, że jeżeli nowa wartość „b” jest widoczny następnie nową wartość „a” jest widoczny, a także . Ale jak właściwie to się dzieje? Czy LoadLoad unieważnia pamięć podręczną/rejestry CPU? Lub po prostu instruuje CPU, aby pobrać wartości zmiennych, które następują po odczytaniu z lotnego ponownie z procesora?
I znaleźć informacji na temat LoadLoad bariery (http://gee.cs.oswego.edu/dl/jmm/cookbook.html):
LoadLoad barier SEKWENCJI: Load1; LoadLoad; Load2 zapewnia, że dane Load1 zostaną wczytane przed dostępem do danych przez Load2, a wszystkie załadowane instrukcje kolejnych obciążeń . Ogólnie rzecz biorąc, bariery LoadLoad są potrzebne w przypadku procesorów, które wykonują obciążenia spekulacyjne i/lub przetwarzania poza kolejnością, w którym instrukcje odczytywania obciążenia mogą omijać magazyny oczekujące. Na procesorach, które gwarantują zawsze zachowanie porządku ładunków, bariery te wynoszą zero.
, ale tak naprawdę nie wyjaśnia, w jaki sposób zostało to osiągnięte.
Odpowiedź zależy od architektury procesora - ten sam dokument ma tabelę z każdą instrukcją procesora, która pokazuje, że 'LoadLoad' na przykład jest bez op. Na x86. – assylias
to jak to działa? Mam na myśli, po StoreStore wartości są spłukiwane z powrotem do pamięci. Ale w jaki sposób wątek 2 powinien je zobaczyć? Jeśli LoadLoad oceniany jest jako "no-op", wątek 2 może nadal używać wartości buforowanych. – Janek
, ponieważ model pamięci procesora jest wystarczająco silny, aby zagwarantować, że tak się stanie. Próbuję powiedzieć, że Java składa obietnicę, że jeśli użyjesz niestabilności, coś się nie stanie. Sposób implementacji w JVM zależy od procesora i wykorzystuje instrukcje ad hoc (lub brak instrukcji, jeśli jest to istotne). Więcej informacji na temat punktu LoadLoad/x86 można znaleźć tutaj: http://altair.cs.oswego.edu/pipermail/concrency-interest/2012-July/009615.html – assylias