Middle
Este fluxul lazy o construcție sigură pentru fire?
sobes.tech AI
Răspuns de la AI
lazy în Kotlin, în mod implicit, nu este sigur pentru fire. Siguranța pentru fire se realizează prin specificarea unui mod special de inițializare.
Modurile disponibile (enumerarea LazyThreadSafetyMode):
SYNCHRONIZED: Implicit. Se folosește un bloc pentru a asigura că doar un fir inițializează valoarea într-un moment dat. Toate firele văd aceeași valoare inițializată.PUBLICATION: Mai multe fire pot executa simultan lambda de inițializare. Primul fir care inițializează cu succes câștigă. Rezultatele celorlalte sunt ignorate. Firele care așteaptă inițializarea vor primi fie valoarea deja inițializată, fie valoarea inițializată de alt fir.NONE: Fără garanții de siguranță pentru fire. Modul cel mai rapid. Nu folosiți acest mod dacă există posibilitatea accesului la proprietatea lazy din mai multe fire în același timp.
Exemplu de utilizare cu specificare explicită a modului:
// Mod sigur pentru fire, SYNCHRONIZED (implicit)
val safeLazyValue: String by lazy {
// Cod de inițializare
"Șir sigur pentru fire (SYNCHRONIZED)"
}
// Mod PUBLICATION - poate fi inițializat de mai multe fire, dar rezultatul va fi unul singur.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
// Cod de inițializare
"Șir sigur pentru fire (PUBLICATION)"
}
// Mod nesigur pentru fire. Rapid, dar periculos în multithreading.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
// Cod de inițializare
"Șir nesigur pentru fire (NONE)"
}