Sobes.tech
Junior — Middle

Kokia reikšmė turės skaitiklio kintamasis po 100 korutinų paleidimo, iš kurių kiekviena padidins jo reikšmę 1000 kartų?

sobes.tech AI

Atsakymas iš AI

Jei 100 korutinų vienu metu padidina tą pačią skaitiklio kintamąjį 1000 kartų be sinchronizacijos, galutinis rezultatas tikriausiai bus mažesnis nei tikėtasi 100000 (100 * 1000) dėl lenktynių sąlygų.

Priežastis ta, kad inkremento operacijos nėra atominės: skaitymas, didinimas ir įrašymas gali būti nutraukti kitų korutinų.

Norint gauti teisingą rezultatą, reikia naudoti sinchronizacijos mechanizmus, pvz., Mutex iš 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) // Išves 100000
}

Be tokios apsaugos galutinis reikšmė bus nenuspėjama.