Почему AbstractQueuedSynchronizer прерывается при получении блокировки

StackOverflow https://stackoverflow.com/questions/207946

Вопрос

Я просматривал исходный код 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) заключается в передаче прерывания вызывающему потоку, который в противном случае был бы проглочен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top