Вы только что описали вариант использования вычислительной карты Guava .Вы создаете его с помощью:
Map<Key, Value> map = new MapMaker().makeComputingMap(new Function<Key, Value>() {
public Value apply(Key key) {
return new Value().update();
}
));
и используете его:
Value v = map.get(key);
Это гарантирует, что только один поток вызовет update()
, а другие потоки будут блокироваться и ждать, пока метод не завершится.
Скорее всего, вы не хотите, чтобы у вашего значения был метод изменяемого обновления, но это другое обсуждение.