почему AbstractQueuedSynchronizer не сделал acquire() эксклюзивным?

#java #java.util.concurrent

#java #java.util.concurrent

Вопрос:

в документе сказано, что acquire() находится в эксклюзивном режиме:

 // Acquires in exclusive mode, ignoring interrupts.  
public final void acquire(int arg) {
    if (!tryAcquire(arg) amp;amp; acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}
  

Без каких-либо ограничений он сначала вызывается tryAcquire(arg) .

Если поток уже выполнял синхронизацию (получил и не выпустил), другие потоки также могут вызывать tryAcquire (arg) без каких-либо ограничений и могут успешно выполнить получение.

Проще говоря, я имею в виду, почему AbstractQueuedSynchronizer не проверяет, поддерживал ли поток синхронизацию перед вызовом tryAcquire(arg) .

хотя пользователь может реализовать tryAcquire(arg) , убедившись, что второе tryAcquire(arg) не может быть успешным. но я думаю, что это ответственность AQS.

немного подумав, я согласен, что нехорошо реализовывать exclusive в acquire(), лучше реализовать exclusive в tryAcquire().

Комментарии:

1. tryAcquire — это тот, кто проверяет, можно ли его получить. Из документации -> «Этот метод должен запрашивать, позволяет ли состояние объекта получать его в эксклюзивном режиме, и если да, то для его получения. Если этот метод сообщает об ошибке, метод acquire может поставить поток в очередь, если он еще не поставлен в очередь, до тех пор, пока не будет получен сигнал о выпуске из какого-либо другого потока.» Acquire должен вызывать хотя бы один раз метод tryAcquire (), поэтому я не совсем понимаю, почему вы говорите, что он не является эксклюзивным.

2. @aran итак, эксклюзивным является гарантия tryAcquire (), а не Acquire() .вы можете использовать Acquire() для реализации синхронизатора режима общего доступа, такого как readlock . но теперь я понимаю, что будут некоторые проблемы, делающие Acquire эксклюзивным.