Middle
Je to konstrukce bezpečná pro lazy?
sobes.tech AI
Odpověď od AI
lazy v Kotlinu ve výchozím nastavení není vlákny bezpečný. Bezpečnost vláken je dosažena určením speciálního režimu inicializace.
Dostupné režimy (výčet LazyThreadSafetyMode):
SYNCHRONIZED: Výchozí. Používá se zámek k zajištění, že pouze jedno vlákno inicializuje hodnotu v daném okamžiku. Všechna vlákna vidí stejnou inicializovanou hodnotu.PUBLICATION: Několik vláken může současně spouštět lambda inicializátoru. První vlákno, které úspěšně inicializuje, vyhrává. Výsledky ostatních jsou ignorovány. Čekající vlákna obdrží buď již inicializovanou hodnotu, nebo hodnotu inicializovanou jiným vláknem.NONE: Žádné záruky vlákny bezpečnosti. Nejrychlejší režim. Tento režim nepoužívejte, pokud je pravděpodobný přístup k lazy vlastnosti z více vláken současně.
Příklad použití s explicitním určením režimu:
// Vlákny bezpečný režim SYNCHRONIZED (výchozí)
val safeLazyValue: String by lazy {
// Kód inicializace
"Vlákny bezpečný řetězec (SYNCHRONIZED)"
}
// Režim PUBLICATION - může být inicializován více vlákny, ale výsledek bude jeden.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
// Kód inicializace
"Vlákny bezpečný řetězec (PUBLICATION)"
}
// Není vlákny bezpečný režim. Rychlý, ale nebezpečný v multithreadingu.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
// Kód inicializace
"Není vlákny bezpečný řetězec (NONE)"
}