Документация для java.util.concurrent.locks.ReentrantReadWriteLock
Отказ от ответственности: я не очень хорош в Java и просто сравниваю блокировки чтения / записи между C# и Java, чтобы лучше понять эту тему и решения, стоящие за обеими реализациями.
Существует JavaDoc о ReentrantReadWriteLock. В нем говорится следующее о повышении / понижении для блокировок:
- Понижение блокировки... Однако обновление с блокировки чтения на блокировку записи невозможно.
Он также имеет следующий пример, который показывает обновление вручную с блокировки чтения на блокировку записи:
// Here is a code sketch showing how to exploit reentrancy
// to perform lock downgrading after updating a cache
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// upgrade lock manually
#1: rwl.readLock().unlock(); // must unlock first to obtain writelock
#2: rwl.writeLock().lock();
if (!cacheValid) { // recheck
...
}
...
}
use(data);
rwl.readLock().unlock();
Означает ли это, что на самом деле приведенный выше пример в некоторых случаях может работать некорректно - я имею в виду, что между строками #1 и #2 нет блокировки, и базовая структура подвержена изменениям из других потоков. Так что это не может считаться правильным способом обновить блокировку или я что-то здесь упускаю?
1 ответ
Да ты прав. Но этот код обрабатывает ситуацию, вызывая if (!cacheValid) { // recheck
снова после того, как он получил блокировку записи.