Назад к вопросам
Middle
68
questionbank

Является ли lazy потокобезопасной конструкцией?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

lazy в Kotlin по умолчанию не является потокобезопасным. Потокобезопасность достигается за счет указания специального режима инициализации.

Доступные режимы (перечисление LazyThreadSafetyMode):

  • SYNCHRONIZED: По умолчанию. Блокировка используется для обеспечения того, чтобы только один поток инициализировал значение в любой момент времени. Все потоки видят одно и то же инициализированное значение.
  • PUBLICATION: Несколько потоков могут одновременно выполнять лямбду инициализатора. Первый поток, успешно инициализировавший значение, выигрывает. Остальные результаты игнорируются. Потоки, ожидающие инициализации, получат либо уже инициализированное значение, либо значение, инициализированное другим потоком.
  • NONE: Никаких гарантий потокобезопасности. Самый быстрый режим. Не используйте этот режим, если есть вероятность доступа к ленивому свойству из нескольких потоков одновременно.

Пример использования с явным указанием режима:

// Потокобезопасный режим SYNCHRONIZED (по умолчанию)
val safeLazyValue: String by lazy {
    // Код инициализации
    "Потокобезопасная строка (SYNCHRONIZED)"
}

// Режим PUBLICATION - может быть инициализирован несколькими потоками, но результат будет один.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Код инициализации
    "Потокобезопасная строка (PUBLICATION)"
}

// НЕ потокобезопасный режим. Быстрый, но опасный для многопоточности.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Код инициализации
    "Не потокобезопасная строка (NONE)"
}