Я реализую метод чтения или загрузки из кэша с помощью StampedLock
, и мне интересно, могу ли я адаптировать примеры из javadoc лучше, чем этот.
Автор Дуг Ли дал пример «оптимистического чтения» и пример «обновить блокировку чтения до блокировки записи», но в моем случае я хочу сделать оба вместе.
public String getConverted(String input) {
String customised = null;
long stamp = 0L;
while (customised == null) {
if (!lock.validate(stamp)) {
stamp = lock.tryOptimisticRead();
}
customised = cached.get(input);
// if the lock was valid we can trust the value of customised
if (lock.validate(stamp) && customised == null) {
long writeStamp = 0L;
try {
while (customised == null) {
writeStamp = lock.tryConvertToWriteLock(stamp);
if (writeStamp != 0L) {
stamp = writeStamp;
customised = convertToCustom(input);
cached.put(input, customised);
} else {
// so what do we do here (line 15)?
}
}
} finally {
lock.unlock(stamp);
}
} else {
// if the lock was invalid, customised could be anything, so:
customised = null;
// and what do we do here (line 25)?
}
}
return customised;
}
Итак, в алгоритме есть две точки, в которых мне нужно что-то делать - в обоих случаях либо:
Получить жесткий замок - в строке 15:
lock.unlockRead(stamp);
stamp = lock.writeLock();
и в строке 25:
stamp = lock.readLock();
Или что?
Thread.sleep(25);
, который мне не подходит - конечно, StampedLock
может лучше справляться с блокировками в этом потоке!
Но как? Если я просто позвоню readLock()
или writeLock()
, то я откажусь от хорошо закодированных и проверенных алгоритмов организации очередей внутри StampedLock#tryOptimisticRead()
и StampedLock#tryConvertToWriteLock()
.
Или логика, лежащая в основе этих методов, уже утрачена, потому что они однажды потерпели неудачу?