Quasar ReenterantReadWriteLock не может быть получен
У меня есть замок:
private ReentrantReadWriteLock requestWaitingLock;
И я выполняю этот блок внутри Fiber
:
System.out.println(requestWaitingLock.isWriteLocked());
System.out.println(requestWaitingLock.getReadHoldCount());
requestWaitingLock.writeLock().lock();
System.out.println("write lock acquired");
И это потому, что в документации сказано:
общедоступная блокировка void ()
Получает блокировку записи, если ни одна из цепочек чтения и записи не удерживается другой цепью, и немедленно возвращается, устанавливая значение удержания блокировки записи равным единице.
Если текущая цепочка уже содержит блокировку записи, то счетчик удержаний увеличивается на единицу, и метод немедленно возвращается.
Если блокировка удерживается другой цепью, то текущая цепочка отключается для целей планирования цепочки и остается в неактивном состоянии до тех пор, пока блокировка записи не будет получена, и в это время счетчик удержания блокировки записи будет установлен в единицу.
Итак, я получаю этот вывод:
false
0
Это означает, что ни блокировка чтения, ни записи не удерживаются Strand
совсем. Так почему мой Fiber
быть заблокированным?
РЕДАКТИРОВАТЬ. Я почти уверен, что каждое волокно, которое получает этот замок, освободит его, поэтому невозможно, чтобы другие волокна приобретали его бесконечно.
1 ответ
Вы, кажется, вызываете неправильный метод для проверки блокировки считывателя:
getReadHoldCount
- только для текущей темыgetReadLockCount
- для всех потоков в системе