почему AbstractQueuedSynchronizer не сделал acqu () эксклюзивным? - PullRequest
0 голосов
/ 15 марта 2019

Док сказал, что 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 ().

...