Док сказал, что acquire()
находится в эксклюзивном режиме:
// Acquires in exclusive mode, ignoring interrupts.
public final void acquire(int arg) {
if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
Без каких-либо ограничений, он сначала вызывает tryAcquire(arg)
.
Если поток уже удерживал синхронизацию (получени не выпускается), другие потоки также могут вызывать tryAcquire (arg) без каких-либо ограничений и могут успешно получать данные.
Проще говоря, я имею в виду, почему AbstractQueuedSynchronizer не проверяет, удерживал ли поток синхронизациюперед вызовом tryAcquire(arg)
.
, хотя пользователь может реализовать tryAcquire(arg)
, убедившись, что второй tryAcquire(arg)
не может быть успешным. Но я думаю, что это ответственность AQS.
после обдумыванияЯ согласен, что не рекомендуется реализовывать исключение в acqu (), лучше реализовывать исключение в tryAcquire ().