Sobes.tech
Junior — Middle

Akú hodnotu bude mať premenná-čítač po spustení 100 coroutines, z ktorých každá zvýši jej hodnotu 1000-krát?

sobes.tech AI

Odpoveď od AI

Ak 100 korutín súčasne zvyšuje rovnakú premennú počítadla 1000-krát bez synchronizácie, konečná hodnota bude pravdepodobne menšia ako očakávaných 100000 (100 * 1000) kvôli súťažným podmienkam.

Dôvodom je, že operácie inkrementácie nie sú atómové: čítanie, zvýšenie a zápis môžu byť prerušené inými korutinami.

Pre získanie správneho výsledku je potrebné použiť mechanizmy synchronizácie, naprí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) // Vytlačí 100000
}

Bez takejto ochrany bude konečná hodnota nepredvídateľná.