Sobes.tech
Middle

Lazy потокът безопасен ли е за нишки?

sobes.tech AI

Отговор от 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)"
}