В каких режимах может работать by lazy

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

Ответ

by lazy в Kotlin может работать в трёх режимах:

  1. LazyThreadSafetyMode.SYNCHRONIZED (по умолчанию)
    Гарантирует потокобезопасность, но с небольшими накладными расходами на синхронизацию:
    val lazyValue: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
        "Initialized"
    }
  1. LazyThreadSafetyMode.PUBLICATION
    Разрешает множественную инициализацию, но возвращает первый успешный результат:
    val lazyValue by lazy(LazyThreadSafetyMode.PUBLICATION) {
        Thread.sleep(100)
        "Initialized"
    }
  1. LazyThreadSafetyMode.NONE
    Не потокобезопасен, но самый быстрый. Используется только в однопоточных сценариях:
    val lazyValue by lazy(LazyThreadSafetyMode.NONE) {
        "Initialized"
    }