Sobes.tech
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.