Sobes.tech
Junior — Middle

Milyen értéket vesz fel a számláló változó, miután 100 coroutine indult, amelyek mindegyike 1000-szer növeli az értékét?

sobes.tech MI

Válasz az MI-től

Ha 100 korutin egyidejűleg ugyanazt a számlálót változót növeli meg 1000 alkalommal szinkronizáció nélkül, akkor az eredmény valószínűleg kevesebb lesz a várt 100000-nél (100 * 1000) a versenyhelyzetek miatt.

Ennek oka, hogy a növelő műveletek nem atomiak: az olvasás, növelés és írás más korutinok által megszakítható.

Hogy helyes eredményt kapjunk, szinkronizációs mechanizmusokat kell használni, például a kotlinx.coroutines Mutex-át:

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) // 100000-t fog nyomtatni
}

E nélkül a védelem nélkül a végső érték kiszámíthatatlan lesz.