Sobes.tech
Junior — Middle

Welke waarde krijgt de teller-variabele na het starten van 100 coroutines, die elk hun waarde 1000 keer verhogen?

sobes.tech AI

Antwoord van AI

Als 100 coroutines tegelijkertijd dezelfde teller variabele 1000 keer verhogen zonder synchronisatie, zal de uiteindelijke waarde waarschijnlijk minder zijn dan de verwachte 100000 (100 * 1000) vanwege racecondities.

De reden is dat incrementele bewerkingen niet atomair zijn: lezen, verhogen en schrijven kunnen door andere coroutines onderbroken worden.

Om een correct resultaat te krijgen, moeten synchronisatie-mechanismen worden gebruikt, bijvoorbeeld Mutex van 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) // Zal 100000 afdrukken
}

Zonder deze bescherming is de uiteindelijke waarde onvoorspelbaar.