Por que AbstractQueuedSynchronizer interromper na aquisição de bloqueio
-
03-07-2019 - |
Pergunta
Eu estava olhando para o código fonte do java.uti.concurrent.locks.AbstractQueuedSynchronizer ea aquisição () método é algo como isto -
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
Por que interromper a adquirir chamadas thread ()? Se houve verificação em algum lugar no método tópicos run (), então ele pode passar depois de chamar adquirir () que é provavelmente indesejável e impensados?
cuidado ninguém para lançar luz sobre por que o pedaço de código acima faz isso?
Solução
Se você ler o Javadoc para acquiredQueued
, você notou que ele retorna true se o segmento foi interrompido enquanto espera. Assim, a chamada para selfInterrupt
(como é chamado no código fonte OpenJDK) é propagar a interrupção para o segmento de chamada, que de outra forma são engolidos.