Junior — Middle
Kokia reikšmė turės skaitiklio kintamasis po 100 korutinų paleidimo, iš kurių kiekviena padidins jo reikšmę 1000 kartų?
sobes.tech AI
Atsakymas iš AI
Jei 100 korutinų vienu metu padidina tą pačią skaitiklio kintamąjį 1000 kartų be sinchronizacijos, galutinis rezultatas tikriausiai bus mažesnis nei tikėtasi 100000 (100 * 1000) dėl lenktynių sąlygų.
Priežastis ta, kad inkremento operacijos nėra atominės: skaitymas, didinimas ir įrašymas gali būti nutraukti kitų korutinų.
Norint gauti teisingą rezultatą, reikia naudoti sinchronizacijos mechanizmus, pvz., Mutex iš 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) // Išves 100000
}
Be tokios apsaugos galutinis reikšmė bus nenuspėjama.