Junior — Middle
Akú hodnotu bude mať premenná-čítač po spustení 100 coroutines, z ktorých každá zvýši jej hodnotu 1000-krát?
sobes.tech AI
Odpoveď od AI
Ak 100 korutín súčasne zvyšuje rovnakú premennú počítadla 1000-krát bez synchronizácie, konečná hodnota bude pravdepodobne menšia ako očakávaných 100000 (100 * 1000) kvôli súťažným podmienkam.
Dôvodom je, že operácie inkrementácie nie sú atómové: čítanie, zvýšenie a zápis môžu byť prerušené inými korutinami.
Pre získanie správneho výsledku je potrebné použiť mechanizmy synchronizácie, napríklad 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) // Vytlačí 100000
}
Bez takejto ochrany bude konečná hodnota nepredvídateľná.