Warum ist das Ergebnisobjekt in FutureTask nichtflüchtig?

8

Ich habe die FutureTask-Klasse in jsr166 gelesen, festgestellt, dass das Ergebnisobjekt nicht-flüchtig ist, die Kommentare im Code sind "nicht flüchtig, geschützt durch Zustand liest / schreibt" Zeile 75, der Zustand ist flüchtig int. Ich habe Java Memory Model von Java-Sprachspezifikation gelesen, aber nicht die genaue gefunden Antworten. Kennt jemand den Grund?

    
taigetco 21.01.2013, 04:08
quelle

1 Antwort

5

Betrachte dieses Programm:

%Vor%

Wenn volatile vr2 % DONE anzeigt, bedeutet dies, dass es nach dem volatilen Schreibvorgang vw1 passiert. So haben wir passiert-vor-Beziehungen: w1 -> vw1 -> vr2 -> r2 . Deshalb schreiben Sie w1 ist sichtbar, um r2 zu lesen.

Allerdings ist succeed() nicht Thread-sicher, da vr0 und vw1 nicht atomar sind. Wenn wir CAS verwenden

%Vor%

behebt das Problem der Atomarität. Allerdings ist w1 nicht unbedingt für r2 sichtbar. Der Memory-Barriere-Effekt von CAS ist so ähnlich wie

%Vor%

Wir haben hier vw0 -> vr2 -> r2 , aber w1 ist nicht in der Kette, es gibt keine w1 -> r2

Wir müssen das volatile schreiben state=DONE nach w1 ausführen, um die "happes-before" -Kette zu erstellen.

%Vor%

oder in CAS

%Vor%     
irreputable 21.01.2013, 05:30
quelle

Tags und Links