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?
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
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
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.
oder in CAS
%Vor%Tags und Links java concurrency lock-free