Sobes.tech
Middle — Middle+

Como é que os Coroutine Actors ajudam a evitar condições de corrida ao executar operações paralelas?

sobes.tech IA

Resposta da IA

Os atores de coroutine são um padrão no Kotlin Coroutines que ajuda a gerir o estado e a realizar operações paralelas sem condições de corrida.

Como funciona:

  • Um ator é uma coroutine que processa sequencialmente as mensagens recebidas (comandos).
  • Todas as alterações de estado ocorrem dentro desta coroutine, garantindo acesso sequencial aos dados.
  • Outras coroutines interagem com o ator enviando mensagens, sem alterar diretamente o estado.

Desta forma, evita-se a condição de corrida porque não há acesso paralelo ao estado compartilhado — todas as operações são realizadas por ordem dentro do ator.

Exemplo:

sealed class CounterMsg
object IncCounter : CounterMsg()
class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()

fun CoroutineScope.counterActor() = actor<CounterMsg> {
    var counter = 0
    for (msg in channel) {
        when (msg) {
            is IncCounter -> counter++
            is GetCounter -> msg.response.complete(counter)
        }
    }
}

// Uso
val counter = counterActor()
counter.send(IncCounter)
val response = CompletableDeferred<Int>()
counter.send(GetCounter(response))
println("Counter = ${response.await()}")

Este método simplifica a escrita de código paralelo seguro sem usar bloqueios e mecanismos de sincronização complexos.