Sobes.tech
Middle

Est-ce une construction sûre pour les flux paresseux?

sobes.tech IA

Réponse de l'IA

lazy en Kotlin n'est pas thread-safe par défaut. La sécurité des threads est assurée en spécifiant un mode d'initialisation particulier.

Les modes disponibles (énumération LazyThreadSafetyMode) :

  • SYNCHRONIZED : Par défaut. Un verrou est utilisé pour garantir qu'une seule thread initialise la valeur à un moment donné. Toutes les threads voient la même valeur initialisée.
  • PUBLICATION : Plusieurs threads peuvent exécuter simultanément la lambda d'initialisation. Le premier thread qui initialise avec succès gagne. Les autres résultats sont ignorés. Les threads en attente d'initialisation recevront soit une valeur déjà initialisée, soit une valeur initialisée par un autre thread.
  • NONE : Aucune garantie de sécurité pour les threads. Mode le plus rapide. N'utilisez pas ce mode si vous risquez d'accéder à la propriété paresseuse depuis plusieurs threads en même temps.

Exemple d'utilisation avec spécification explicite du mode :

// Mode thread-safe SYNCHRONIZED (par défaut)
val safeLazyValue: String by lazy {
    // Code d'initialisation
    "Chaîne thread-safe (SYNCHRONIZED)"
}

// Mode PUBLICATION - peut être initialisé par plusieurs threads, mais le résultat sera unique.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // Code d'initialisation
    "Chaîne thread-safe (PUBLICATION)"
}

// Mode non thread-safe. Rapide, mais dangereux en multithreading.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // Code d'initialisation
    "Chaîne non thread-safe (NONE)"
}