Почему AbstractQueuedSynchronizer прерывается при получении блокировки
-
03-07-2019 - |
Вопрос
Я просматривал исходный код java.uti.concurrent.locks.AbstractQueuedSynchronizer, и методacquire() выглядит примерно так:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
Почему он прерывает поток, вызывающий метод Acquire()?Если где-то в методе run() потоков была проверка, то она могла бы пройти после вызоваacquire(), что, вероятно, нежелательно и немыслимо?
Кто-нибудь хочет пролить свет на то, почему приведенный выше фрагмент кода делает это?
Решение
Если вы прочитали Javadoc для acquiredQueued
, вы заметите, что он возвращает true, если поток был прерван во время ожидания.Таким образом, вызов selfInterrupt
(как это называется в исходном коде OpenJDK) заключается в передаче прерывания вызывающему потоку, который в противном случае был бы проглочен.
Не связан с StackOverflow