Sobes.tech
Middle

Is een lazy-stroom een thread-veilige constructie?

sobes.tech AI

Antwoord van AI

lazy in Kotlin is standaard niet thread-safe. Threadveiligheid wordt bereikt door een speciale initialisatiemodus aan te geven.

Beschikbare modi (enumeratie LazyThreadSafetyMode):

  • SYNCHRONIZED: Standaard. Een lock wordt gebruikt om te garanderen dat slechts één thread de waarde initialiseert op een gegeven moment. Alle threads zien dezelfde geïnitialiseerde waarde.
  • PUBLICATION: Meerdere threads kunnen gelijktijdig de initialisator lambda uitvoeren. De eerste thread die succesvol initialiseert wint. De resultaten van de anderen worden genegeerd. Wachtende threads krijgen of een al geïnitialiseerde waarde of een door een andere thread geïnitialiseerde waarde.
  • NONE: Geen garanties voor threadveiligheid. De snelste modus. Gebruik deze modus niet als er kans is dat meerdere threads gelijktijdig toegang krijgen tot de lazy property.

Voorbeeld met expliciete specificatie van de modus:

// Thread-safe modus SYNCHRONIZED (standaard)
val safeLazyValue: String by lazy {
    // Initialisatiecode
    "Thread-safe string (SYNCHRONIZED)"
}

// PUBLICATION modus - kan door meerdere threads worden geïnitialiseerd, maar resultaat is één.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Initialisatiecode
    "Thread-safe string (PUBLICATION)"
}

// Niet thread-safe modus. Snel, maar gevaarlijk in multithreading.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Initialisatiecode
    "Niet thread-safe string (NONE)"
}