Junior — Middle
Koju će vrednost imati promenljiva-brojilica nakon pokretanja 100 korutina, od kojih svaka poveća njenu vrednost 1000 puta?
sobes.tech АИ
Одговор од АИ
Ako 100 korutina istovremeno povećava istu promenljivu brojač 1000 puta bez sinhronizacije, krajnja vrednost će verovatno biti manja od očekivanih 100000 (100 * 1000) zbog uslova trke.
Razlog je što operacije inkrementacije nisu atomarne: čitanje, povećanje i zapis mogu biti prekinuti od strane drugih korutina.
Da biste dobili tačan rezultat, potrebno je koristiti mehanizme sinhronizacije, na primer, Mutex iz 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) // Ispisaće 100000
}
Bez ove zaštite, krajnja vrednost će biti nepredvidiva.