Junior — Middle
Milyen értéket vesz fel a számláló változó, miután 100 coroutine indult, amelyek mindegyike 1000-szer növeli az értékét?
sobes.tech MI
Válasz az MI-től
Ha 100 korutin egyidejűleg ugyanazt a számlálót változót növeli meg 1000 alkalommal szinkronizáció nélkül, akkor az eredmény valószínűleg kevesebb lesz a várt 100000-nél (100 * 1000) a versenyhelyzetek miatt.
Ennek oka, hogy a növelő műveletek nem atomiak: az olvasás, növelés és írás más korutinok által megszakítható.
Hogy helyes eredményt kapjunk, szinkronizációs mechanizmusokat kell használni, például a kotlinx.coroutines Mutex-át:
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) // 100000-t fog nyomtatni
}
E nélkül a védelem nélkül a végső érték kiszámíthatatlan lesz.