Sobes.tech
Middle

Vai tas ir droša lazy plūsmas konstrukcija?

sobes.tech AI

Atbilde no AI

lazy Kotlin pēc noklusējuma nav drošs pret pavedieniem. Drošība pret pavedieniem tiek panākta, norādot īpašu inicializācijas režīmu.

Pieejamie režīmi (uzskaitījums LazyThreadSafetyMode):

  • SYNCHRONIZED: Noklusējums. Tiek izmantots aizslēgs, lai nodrošinātu, ka tikai viens pavediens vienlaikus inicializē vērtību. Visas pavedieni redz to pašu inicializēto vērtību.
  • PUBLICATION: Vairāki pavedieni var vienlaikus izpildīt inicializācijas lambda. Pirmais veiksmīgi inicializējošais pavediens uzvar. Citu rezultāti tiek ignorēti. Gaidīšanas pavedieni saņems vai jau inicializētu vērtību, vai vērtību, ko inicializējis cits pavediens.
  • NONE: Nav garantiju par pavedienu drošību. Ātrākais režīms. Nelietojiet šo režīmu, ja pastāv iespēja, ka vairāki pavedieni vienlaikus piekļūs lazy īpašībai.

Piemērs ar skaidru režīma norādi:

// Drošs pret pavedieniem režīms SYNCHRONIZED (noklusējums)
val safeLazyValue: String by lazy {
    // Inicializācijas kods
    "Drošs pret pavedieniem virkne (SYNCHRONIZED)"
}

// PUBLICATION režīms - var tikt inicializēts ar vairākiem pavedieniem, bet rezultāts būs viens.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Inicializācijas kods
    "Drošs pret pavedieniem virkne (PUBLICATION)"
}

// Nav drošs pret pavedieniem režīms. Ātrs, bet bīstams daudzpavedienu vidē.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Inicializācijas kods
    "Nedrošs pret pavedieniem virkne (NONE)"
}