Почему AbstractQueuedSynchronizer прерывается при получении блокировки - PullRequest
1 голос
/ 16 октября 2008

Я искал исходный код java.uti.concurrent.locks.AbstractQueuedSynchronizer, а метод acquain () выглядит примерно так:

 public final void acquire(int arg) {
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        Thread.currentThread().interrupt();
}

Почему он прерывает поток, вызывающий acqu ()? Если в потоке run () где-то была проверка, то она может пройти после вызова acqu (), что, вероятно, нежелательно и не задумано?

Кто-нибудь хочет пролить свет на то, почему вышеупомянутый кусок кода это делает?

1 Ответ

4 голосов
/ 16 октября 2008

Если вы прочитаете Javadoc для acquiredQueued, вы заметите, что он возвращает true, если поток был прерван во время ожидания. Таким образом, вызов selfInterrupt (как он вызывается в исходном коде OpenJDK) должен передать прерывание вызывающему потоку, который в противном случае был бы проглочен.

...