Junior — Middle
Jakou hodnotu bude mít proměnná-čítač po spuštění 100 coroutine, z nichž každá zvýší její hodnotu o 1 000krát?
sobes.tech AI
Odpověď od AI
Pokud 100 coroutine současně zvýší stejnou proměnnou počítadla 1000krát bez synchronizace, konečná hodnota bude pravděpodobně menší než očekávaných 100000 (100 * 1000) kvůli závodním podmínkám.
Důvodem je, že operace inkrementace nejsou atomické: čtení, zvýšení a zápis mohou být přerušeny jinými coroutine.
Pro získání správného výsledku je třeba použít mechanismy synchronizace, napří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) // Vytiskne 100000
}
Bez takové ochrany bude konečná hodnota nejistá.