Perché AbstractQueuedSynchronizer si interrompe all'acquisizione del blocco
-
03-07-2019 - |
Domanda
Stavo guardando il codice sorgente di java.uti.concurrent.locks.AbstractQueuedSynchronizer e il metodo acquisizione () è simile a questo -
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
Perché interrompe il thread che chiama acquisisce ()? Se fosse presente un punto di controllo nel metodo run () dei thread, potrebbe passare dopo aver chiamato acquisizione () che è probabilmente indesiderabile e non pensato?
Qualcuno si preoccupa di far luce sul perché il codice sopra riportato lo fa?
Soluzione
Se leggi Javadoc per acquisitoQueued
, noterai che ritorna vero se il thread è stato interrotto durante l'attesa. Pertanto, la chiamata a selfInterrupt
(come viene chiamata nel codice sorgente OpenJDK) è di propagare l'interrupt al thread chiamante, che altrimenti verrebbe ingoiato.