Wenn Sie einen Kommentar über dem Code lesen, wird erwähnt, dass ...
Wenn der Aufrufer kein a ist ForkJoinTask
, entspricht diese Methode verhaltensmäßig
while (!blocker.isReleasable())
if (blocker.block())
return;
}
Es ist also nur eine andere Form, den obigen Code in einem anderen Teil zu implementieren ... !!
In Style Notes wird erwähnt, dass,
Es gibt mehrere Vorkommen des ungewöhnlichen "do {} while (! Cas ...)", das die einfachste Möglichkeit ist, eine Aktualisierung einer CAS-Variablen zu erzwingen.
Wenn die Implementierung von ManagedLocker # isReleasable angezeigt wird , wird die Sperre aktualisiert und zurückgegeben, true
wenn keine Blockierung erforderlich ist.
Interpretation :
Leer, während Schleifen verwendet werden, um einen Interrupt bereitzustellen, bis eine Bedingung auf wahr / falsch zurückgesetzt wird.
Hier do { } while(!...)
ist ein Blocker / Unterbrechung , bis blocker.block()
sein wird , true
wenn blocker.isReleasable()
ist false
. Die Schleife setzt die Ausführung fort, solange sie blocker
nicht freigebbar ist ( !blocker.isReleasable()
) und blocker
nicht blockiert ist !! Die Ausführung wird außerhalb der Schleife sein, sobald blocker.block()
sie auf true gesetzt ist.
Beachten Sie, dass do{ } while(...)
die CAS-Variable nicht aktualisiert wird, aber garantiert, dass das Programm wartet, bis die Variable aktualisiert wird (erzwingen Sie, bis die Variable aktualisiert wird).