Junior — Middle
Ce valoare va avea variabila contor după lansarea a 100 de corutine, fiecare dintre ele crescând valoarea sa de 1000 de ori?
sobes.tech AI
Răspuns de la AI
Dacă 100 corutine cresc simultan aceeași variabilă de tip contor de 1000 de ori fără sincronizare, valoarea finală va fi cel mai probabil mai mică decât cele 100000 așteptate (100 * 1000) din cauza condițiilor de cursă.
Motivul este că operațiile de incrementare nu sunt atomice: citirea, creșterea și scrierea pot fi întrerupte de alte corutine.
Pentru a obține un rezultat corect, trebuie utilizate mecanisme de sincronizare, de exemplu, Mutex din 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) // Va afișa 100000
}
Fără această protecție, valoarea finală va fi imprevizibilă.