Junior — Middle
Qual será o valor da variável contador após a execução de 100 coroutines, cada uma aumentando seu valor em 1 mil vezes?
sobes.tech IA
Resposta da IA
Se 100 coroutines aumentarem simultaneamente uma mesma variável contador 1000 vezes sem sincronização, o valor final provavelmente será menor que os 100000 esperados (100 * 1000) devido a condições de corrida.
A razão é que as operações de incremento não são atômicas: leitura, aumento e escrita podem ser interrompidos por outras coroutines.
Para obter um resultado correto, é necessário usar mecanismos de sincronização, por exemplo, Mutex do 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) // Vai imprimir 100000
}
Sem essa proteção, o valor final será imprevisível.