Является ли lazy потокобезопасным

«Является ли lazy потокобезопасным» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

lazy в Kotlin по умолчанию не потокобезопасен. Если инициализация происходит в нескольких потоках одновременно, может возникнуть race condition, и лямбда выполнится несколько раз.

Для потокобезопасной ленивой инициализации используйте LazyThreadSafetyMode:

val safeLazyValue: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    "Thread-safe value"
}

Доступные режимы:

  • SYNCHRONIZED (по умолчанию в Android) — блокирует все потоки, кроме одного.
  • PUBLICATION — допускает множественную инициализацию, но возвращает первый результат.
  • NONE — небезопасный, но самый быстрый (только для однопоточного использования).

Пример без синхронизации (опасно!):

val unsafeLazyValue by lazy { ... } // Может сломаться в мультипоточной среде