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)"
}