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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top