Junior — Middle
Jaką wartość przyjmie zmienna licznik po uruchomieniu 100 korutyn, z których każda zwiększy jej wartość 1000 razy?
sobes.tech AI
Odpowiedź od AI
Jeśli 100 korutyn jednocześnie zwiększa tę samą zmienną licznika 1000 razy bez synchronizacji, końcowa wartość prawdopodobnie będzie mniejsza od oczekiwanych 100000 (100 * 1000) z powodu warunków wyścigu.
Przyczyną jest to, że operacje inkrementacji nie są atomowe: odczyt, zwiększenie i zapis mogą być przerwane przez inne korutyny.
Aby uzyskać poprawny wynik, należy użyć mechanizmów synchronizacji, na przykład Mutex z 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) // Wypisze 100000
}
Bez takiej ochrony końcowa wartość będzie nieprzewidywalna.