Pourquoi AbstractQueuedSynchronizer s'interrompt-il lors de l'acquisition d'un verrou?
-
03-07-2019 - |
Question
Je regardais le code source de java.uti.concurrent.locks.AbstractQueuedSynchronizer et la méthode Acquérir () ressemble à quelque chose comme ça -
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
Pourquoi cela interrompt-il le fil appelant une acquisition ()? S'il y avait une vérification quelque part dans la méthode run () des threads, elle risquait de passer après l'appel de l'acquisition (), ce qui est probablement indésirable et impensé?
Quelqu'un veut-il expliquer pourquoi le code ci-dessus fait cela?
La solution
Si vous lisez la Javadoc pour l'acquisitionQueued
, vous remarquerez qu'elle renvoie la valeur true si le thread a été interrompu pendant l'attente. Ainsi, l'appel à selfInterrupt
(comme il est appelé dans le code source OpenJDK) consiste à propager l'interruption vers le thread appelant, qui sinon serait avalé.