Ответ
lazy в Kotlin по умолчанию не потокобезопасен. Если инициализация происходит в нескольких потоках одновременно, может возникнуть race condition, и лямбда выполнится несколько раз.
Для потокобезопасной ленивой инициализации используйте LazyThreadSafetyMode:
val safeLazyValue: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
"Thread-safe value"
}
Доступные режимы:
SYNCHRONIZED(по умолчанию в Android) — блокирует все потоки, кроме одного.PUBLICATION— допускает множественную инициализацию, но возвращает первый результат.NONE— небезопасный, но самый быстрый (только для однопоточного использования).
Пример без синхронизации (опасно!):
val unsafeLazyValue by lazy { ... } // Может сломаться в мультипоточной среде