ReadWriteLock
понижение допускается ReentrantReadWriteLock
реализации (tryLock()
из приведенного ниже примера всегда возвращает true
):Почему обновление ReadWriteLock не разрешено?
void downgrade(final ReadWriteLock readWriteLock) {
boolean downgraded = false;
readWriteLock.writeLock().lock();
try {
// Always true, as we already hold a W lock.
final boolean readLockAcquired = readWriteLock.readLock().tryLock();
if (readLockAcquired) {
// Now holding both a R and a W lock.
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 1;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 1;
readWriteLock.writeLock().unlock();
downgraded = true;
try {
// Now do some work with only a R lock held
} finally {
readWriteLock.readLock().unlock();
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 0;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 0;
}
}
} finally {
if (!downgraded) {
// Never (we were holding a W lock while trying a R lock).
readWriteLock.writeLock().unlock();
}
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 0;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 0;
}
}
Какова была идея не позволяет апгрейд замка подобным образом? Метод tryLock()
для Write Блокировки ниже может безопасно вернуть true
ш риска/оа для взаимоблокировки при отсутствии других потоков, проведение чтения замка:
void upgrade(final ReadWriteLock readWriteLock) {
readWriteLock.readLock().lock();
try {
// Always false: lock upgrade is not allowed
final boolean writeLockAcquired = readWriteLock.writeLock().tryLock();
// ...
} finally {
readWriteLock.readLock().unlock();
}
}
Если вы используете Java 8, вы можете захотеть взглянуть на 'StampedLock'. В более общем плане, вы можете захотеть посмотреть [это видео] (https://www.youtube.com/watch?v=Q_0_1mKTlnY) у Анжелики Лангер. Кольца колокола, верно? ;) – fge