Держатель инициализации по требованию работает только для одноэлементного элемента, у вас не должно быть лени-загруженных элементов для каждого экземпляра.Двойная проверка блокировки накладывает когнитивное бремя на всех, кто должен смотреть на класс, так как легко ошибиться тонкими способами.Раньше у нас были всевозможные проблемы с этим, пока мы не инкапсулировали шаблон в служебный класс в нашей библиотеке параллелизма
У нас есть следующие опции:
Supplier<ExpensiveThing> t1 = new LazyReference<ExpensiveThing>() {
protected ExpensiveThing create() {
… // expensive initialisation
}
};
Supplier<ExpensiveThing> t2 = Lazy.supplier(new Supplier<ExpensiveThing>() {
public ExpensiveThing get() {
… // expensive initialisation
}
});
Обаимеют одинаковую семантику в отношении использования.Вторая форма делает любые ссылки, используемые внутренним поставщиком, доступными для GC после инициализации.Вторая форма также поддерживает тайм-ауты с помощью стратегий TTL / TTI.