Sobes.tech
Middle

Czy jest to bezpieczna konstrukcja dla lazy?

sobes.tech AI

Odpowiedź od AI

lazy w Kotlin domyślnie nie jest bezpieczne dla wątków. Bezpieczeństwo wątków osiąga się poprzez określenie specjalnego trybu inicjalizacji.

Dostępne tryby (wyliczenie LazyThreadSafetyMode):

  • SYNCHRONIZED: Domyślnie. Używa blokady, aby zapewnić, że tylko jeden wątek zainicjuje wartość w danym momencie. Wszystkie wątki widzą tę samą zainicjowaną wartość.
  • PUBLICATION: Kilka wątków może jednocześnie wykonywać lambda inicjalizatora. Pierwszy wątek, który pomyślnie zainicjuje wartość, wygrywa. Wyniki pozostałych są ignorowane. Wątki oczekujące na inicjalizację otrzymają albo już zainicjowaną wartość, albo wartość zainicjowaną przez inny wątek.
  • NONE: Brak gwarancji bezpieczeństwa wątków. Najszybszy tryb. Nie używaj tego trybu, jeśli istnieje ryzyko dostępu do właściwości lazy z wielu wątków jednocześnie.

Przykład użycia z wyraźnym określeniem trybu:

// Tryb bezpieczny dla wątków SYNCHRONIZED (domyślny)
val safeLazyValue: String by lazy {
    // Kod inicjalizacji
    "Bezpieczny dla wątków łańcuch (SYNCHRONIZED)"
}

// Tryb PUBLICATION - może być inicjalizowany przez wiele wątków, ale wynik będzie jeden.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Kod inicjalizacji
    "Bezpieczny dla wątków łańcuch (PUBLICATION)"
}

// Niebezpieczny dla wątków tryb. Szybki, ale niebezpieczny w wielowątkowości.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Kod inicjalizacji
    "Niebezpieczny dla wątków łańcuch (NONE)"
}