Глядя в ChronicleMap (2.1.7), и я не совсем понимаю правильное использование WriteContext при вызове метода полученияUsingLocked();ChronicleMap Использование WriteContext
Сценарий, который меня интересует, - это функция, в которой мне нужно предпринять 2 действия атомарно с точки зрения вызывающего функции. Один из них добавляет запись на карту, если ее нет. Другой должен иметь место, если ранее не было значения для данного ключа на карте.
Если ранее не было значения для заданного ключа на карте, и это второе действие не удалось, карта не должна обновляться, поэтому последующие тесты не найдут значения для соответствующего ключа.
Если на карте для данного ключа уже есть запись, я не хочу обновлять ее исходное значение, и я не хочу предпринимать это второе действие. Но мне нужно использовать значение исходной записи, чтобы построить возвращаемое значение для вызывающего.
В документации для WriteContext.created() указано, что он возвращает true, только если запись была ранее. Если запись была ранее представлена, возможно ли получить ссылку на предыдущее значение из контекста (или каким-либо другим способом - например, вызов map.get() в пределах области WriteContext)?
С чем связано WriteContext.value()? Значение предыдущей записи или потенциально обновленное значение, указанное мной в вызове purchaseUsingLocked()?
Кроме того, если ранее не было записи на карте, и я не хочу обновлять карту, я должен вызвать WriteContext.removeEntry() или WriteContext.dontPutOnClose()?
Вот пример логики я думаю, мне нужно:
EntryData newValue = new EntryData();
EntryData originalValue = null;
try (WriteContext<String, EntryData> context = _map.acquireUsingLocked(key, newValue)) {
if (!context.created()) {
if (doSomething()) {
result = createResult(newValue);
}
else {
context.removeEntry();
result = null;
}
}
else {
context.dontPutOnClose();
originalValue = context.value();
result = createResult(originalValue);
}
}