Sobes.tech
Middle

È una costruzione sicura per i flussi lazy?

sobes.tech AI

Risposta dell'AI

lazy in Kotlin di default non è sicuro per i thread. La sicurezza dei thread si ottiene specificando una modalità di inizializzazione speciale.

Modalità disponibili (enumerazione LazyThreadSafetyMode):

  • SYNCHRONIZED: Per impostazione predefinita. Viene utilizzato un blocco per garantire che solo un thread inizializzi il valore in un dato momento. Tutti i thread vedono lo stesso valore inizializzato.
  • PUBLICATION: Più thread possono eseguire simultaneamente la lambda di inizializzazione. Il primo thread che inizializza con successo vince. Gli altri risultati vengono ignorati. I thread in attesa di inizializzazione riceveranno o un valore già inizializzato o un valore inizializzato da un altro thread.
  • NONE: Nessuna garanzia di sicurezza per i thread. Modalità più veloce. Non usare questa modalità se c'è la possibilità di accedere alla proprietà lazy da più thread contemporaneamente.

Esempio di utilizzo con specifica esplicita della modalità:

// Modalità sicura per i thread SYNCHRONIZED (predefinita)
val safeLazyValue: String by lazy {
    // Codice di inizializzazione
    "Stringa sicura per i thread (SYNCHRONIZED)"
}

// Modalità PUBLICATION - può essere inizializzata da più thread, ma il risultato sarà uno solo.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Codice di inizializzazione
    "Stringa sicura per i thread (PUBLICATION)"
}

// Modalità non sicura per i thread. Veloce, ma pericolosa in multithreading.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Codice di inizializzazione
    "Stringa non sicura per i thread (NONE)"
}