Sobes.tech
Junior — Middle

Quelle sera la valeur de la variable compteur après le lancement de 100 coroutines, chacune augmentant sa valeur de 1 000 fois?

sobes.tech IA

Réponse de l'IA

Si 100 coroutines augmentent simultanément une même variable compteur 1000 fois sans synchronisation, la valeur finale sera probablement inférieure aux 100000 attendus (100 * 1000) en raison de conditions de course.

La raison en est que les opérations d'incrémentation ne sont pas atomiques : la lecture, l'augmentation et l'écriture peuvent être interrompues par d'autres coroutines.

Pour obtenir un résultat correct, il faut utiliser des mécanismes de synchronisation, par exemple, Mutex de kotlinx.coroutines :

import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

var counter = 0
val mutex = Mutex()

fun main() = runBlocking {
    val jobs = List(100) {
        launch {
            repeat(1000) {
                mutex.withLock {
                    counter++
                }
            }
        }
    }
    jobs.forEach { it.join() }
    println(counter) // Affichera 100000
}

Sans cette protection, la valeur finale sera imprévisible.