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