В документе ReentrantReadWriteLock есть пример использования понижения блокировки (см. это).
class CachedData {
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
Object data;
volatile boolean cacheValid;
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();//B
} finally {//A
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {//C
rwl.readLock().unlock();
}
}
}
Если я изменю Object data
на volatile Object data
, нужно ли мне по-прежнему понижать уровень блокировки записи до блокировки чтения?
Обновить
Я имею в виду, что если я добавлю volatile
к data
, прежде чем снять блокировку записи в блоке finally
в комментарии A
, нужно ли мне все еще получать блокировку чтения, как это делает код в комментариях B
иC
? Или код может воспользоваться volatile
?