Sobes.tech
Middle

Je lazy tok bezpečnou konštrukciou pre vlákna?

sobes.tech AI

Odpoveď od AI

lazy v Kotlinu po predvolji nie je bezpečný pre vlákna. Bezpečnosť vlákien sa dosahuje určením špeciálneho režimu inicializácie.

Dostupné režimy (výčet LazyThreadSafetyMode):

  • SYNCHRONIZED: Predvolené. Používa sa zámok na zabezpečenie, že iba jedno vlákno inicializuje hodnotu v danom momente. Všetky vlákna vidia rovnakú inicializovanú hodnotu.
  • PUBLICATION: Viacero vlákien môže súčasne vykonávať lambda inicializátora. Prvé vlákno, ktoré úspešne inicializuje, vyhráva. Výsledky ostatných sú ignorované. Čakajúce vlákna dostanú buď už inicializovanú hodnotu, alebo hodnotu inicializovanú iným vláknom.
  • NONE: Žiadne záruky bezpečnosti pre vlákna. Najrýchlejší režim. Tento režim nepoužívajte, ak je pravdepodobný prístup k lazy vlastnosti z viacerých vlákien naraz.

Príklad použitia s explicitným určením režimu:

// Bezpečný režim SYNCHRONIZED (predvolený)
val safeLazyValue: String by lazy {
    // Kód inicializácie
    "Bezpečný reťazec pre vlákna (SYNCHRONIZED)"
}

// Režim PUBLICATION - môže byť inicializovaný viacerými vláknami, ale výsledok bude jeden.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Kód inicializácie
    "Bezpečný reťazec pre vlákna (PUBLICATION)"
}

// Nebezpečný režim pre vlákna. Rýchly, ale nebezpečný v multithreadingu.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Kód inicializácie
    "Nebezpečný reťazec pre vlákna (NONE)"
}