Я смотрел исходный код java.uti.concurrent.locks.AbstractQueuedSynchronizer, и метод collect () выглядит примерно так:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
Thread.currentThread().interrupt();
}
Почему он прерывает поток, вызывающий acqu ()? Если где-то в методе потоков run () была проверка, то она может пройти после вызова acqu (), что, вероятно, нежелательно и о чем не думают?
Кто-нибудь хочет пролить свет на то, почему приведенный выше фрагмент кода делает это?




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