Sobes.tech
Middle

Da li je to konstrukcija sigurna za lazy tokove?

sobes.tech АИ

Одговор од АИ

lazy u Kotlinu po default nije siguran za niti. Sigurnost niti se postiže specificiranjem posebnog režima inicijalizacije.

Dostupni režimi (enumeracija LazyThreadSafetyMode):

  • SYNCHRONIZED: Po defaultu. Koristi se zaključavanje kako bi se osiguralo da samo jedna nit inicijalizira vrednost u bilo kojem trenutku. Sve niti vide istu inicijalizovanu vrednost.
  • PUBLICATION: Više niti može istovremeno izvršavati lambda inicijalizatora. Prva nit koja uspešno inicijalizuje pobeđuje. Ostali rezultati se ignorišu. Niti koje čekaju inicijalizaciju dobiće ili već inicijalizovanu vrednost ili vrednost inicijalizovanu od strane druge niti.
  • NONE: Nema garancija za sigurnost niti. Najbrži režim. Nemojte koristiti ovaj režim ako postoji mogućnost pristupa lazy svojstvu iz više niti istovremeno.

Primer korišćenja sa eksplicitnim navođenjem režima:

// Siguran režim SYNCHRONIZED (po defaultu)
val safeLazyValue: String by lazy {
    // Kod inicijalizacije
    "Sigurna za niti string (SYNCHRONIZED)"
}

// Režim PUBLICATION - može biti inicijalizovan od više niti, ali rezultat će biti jedan.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Kod inicijalizacije
    "Sigurna za niti string (PUBLICATION)"
}

// Nije siguran za niti režim. Brz, ali opasan u višestrukom okruženju.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Kod inicijalizacije
    "Nesiguran za niti string (NONE)"
}