#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 эксклюзивным.