Sobes.tech
Middle

Biztosítja-e a lazy áram a szálbiztonságot?

sobes.tech MI

Válasz az MI-től

A Kotlinban a lazy alapértelmezés szerint nem szálbiztos. A szálbiztonságot egy speciális inicializálási mód megadásával érhetjük el.

Elérhető módok (a LazyThreadSafetyMode felsorolás):

  • SYNCHRONIZED: Alapértelmezett. Egy zárral biztosítja, hogy csak egy szál inicializálja az értéket egy adott pillanatban. Minden szál ugyanazt az inicializált értéket látja.
  • PUBLICATION: Több szál egyidejűleg futtathatja az inicializáló lambda-t. Az első sikeresen inicializáló szál nyer. A többi eredményei figyelmen kívül maradnak. A várakozó szálak vagy már inicializált értéket kapnak, vagy egy másik szál által inicializált értéket.
  • NONE: Nincs garancia a szálbiztonságra. A leggyorsabb mód. Ne használd ezt a módot, ha több szálból való hozzáférés valószínűsíthető.

Példa a mód explicit megadásával:

// Szálbiztos mód SYNCHRONIZED (alapértelmezett)
val safeLazyValue: String by lazy {
    // Inicializáló kód
    "Szálbiztos szöveg (SYNCHRONIZED)"
}

// PUBLICATION mód - több szál is inicializálhatja, de az eredmény egy lesz.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Inicializáló kód
    "Szálbiztos szöveg (PUBLICATION)"
}

// Nem szálbiztos mód. Gyors, de veszélyes több szálas környezetben.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Inicializáló kód
    "Nem szálbiztos szöveg (NONE)"
}