Я хотел бы использовать карту, которая была бы эквивалентна ConcurrentMap
(мне нужен эквивалент метода putIfAbsent), но это не заставляло бы меня создавать объект заранее.
Например, когда я делаю это:
m.putIfAbsent( key, new CyclingArray() );
Я могу в конечном итоге создать новый объект CyclingArray (что бы это ни было) ни за что.
Конечно, я понимаю, что могу заблокировать всю карту, но это лишило бы смысла ConcurrentMap
.
Может ли что-то вроде следующего работать концептуально?
m.putIfAbsent( key, new Callback<CyclingArray>() {
@Override
public CyclingArray provide() {
return new CyclingArray(); // only called if the key wasn't already present
}
}
Знаете ли вы какую-нибудь библиотеку, предлагающую карту, которая:
- предложить «интерфейс», подобный тому, который предлагает ConcurrentMap, включая метод
putIfAbsent
. - блокирует только тот сегмент, с которым мы собираемся работать (как, например, реализация
ConcurrentHashMap
) - позволяет дополнительно создать значение тогда и только тогда, когда ключ еще не присутствовал, и, следовательно, избежать бесполезной генерации мусора.
- не заставляет меня сначала использовать containsKey, а затем putIfAbsent, потому что это также каким-то образом противоречит цели putIfAbsent.
Обратите внимание, что я не спрашиваю, можно ли выполнить приведенный выше пример с помощью ConcurrentMap
(это невозможно, насколько я знаю).
Я думал о расширении ConcurrentHashMap
и перегрузке putIfAbsent версией обратного вызова, но, к сожалению, ConcurrentHashMap
внутренне использует окончательный класс Segment.
Прежде чем заново изобретать колесо, я хотел бы знать, есть ли какие-либо карты, уже предлагающие аналогичную функциональность.