¿Por qué AbstractQueuedSynchronizer interrumpe al adquirir el bloqueo?
-
03-07-2019 - |
Pregunta
Estaba buscando en el código fuente de java.uti.concurrent.locks.AbstractQueuedSynchronizer y el método adquiere () se parece a esto:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
¿Por qué interrumpe el subproceso que llama a adquisiciones ()? Si hubo una comprobación en algún lugar del método run (), entonces podría pasar después de llamar a adquirir (), lo que probablemente sea indeseable e impensado.
¿A alguien le interesa aclarar por qué el código anterior hace esto?
Solución
Si lees el Javadoc para adquiridoQueued
, te darás cuenta de que devuelve verdadero si el hilo se interrumpió mientras esperabas. Por lo tanto, la llamada a selfInterrupt
(como se llama en el código fuente de OpenJDK) es propagar la interrupción al subproceso que realiza la llamada, que de otro modo se tragaría.