Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: atomic, operation

Почему computeIfAbsent() лучше, чем putIfAbsent() в некоторых сценариях?

Вопрос проверяет понимание атомарных операций и скрытых гонок при инициализации значений.

Короткий ответ

computeIfAbsent() атомарно проверяет наличие ключа и создаёт значение.
putIfAbsent() требует предварительного создания объекта.
Это может привести к лишним вычислениям.
computeIfAbsent() предотвращает гонки и дублирование логики.
Он особенно полезен при дорогой инициализации.

Длинный ответ

Разница между этими методами часто недооценивается.

Поведение putIfAbsent()

Object lock = new Object();
locks.putIfAbsent(id, lock);

Недостатки:

  • объект создаётся всегда

  • при гонке несколько потоков создадут лишние объекты

  • логика инициализации не атомарна

Поведение computeIfAbsent()

Object lock = locks.computeIfAbsent(id, k -> new Object());

Преимущества:

  • инициализация происходит только при отсутствии ключа

  • операция атомарна

  • код короче и безопаснее

Когда разница критична

  • дорогая инициализация (IO, конфигурация)

  • хранение локов

  • кеширование вычисляемых значений

Ограничения

  • функция инициализации не должна иметь побочных эффектов

  • не гарантируется единичный вызов при сложных сценариях (важно читать контракт)

Вывод

computeIfAbsent() предпочтительнее, когда важно атомарно и лениво создавать значения.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#atomic

#operation

Подпишись на Java Developer в телеграм