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, truewenn 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 , truewenn blocker.isReleasable()ist false. Die Schleife setzt die Ausführung fort, solange sie blockernicht freigebbar ist ( !blocker.isReleasable()) und blockernicht 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).