Sobes.tech
Junior — Middle

Milline väärtus saab olema loendur-muutujal pärast 100 korutina käivitamist, millest igaüks suurendab selle väärtust 1000 korda?

sobes.tech AI

Vastus AI-lt

Kui 100 korutinit samal ajal suurendavad sama loendurimuutujat 1000 korda ilma sünkroniseerimiseta, on lõplik väärtus tõenäoliselt väiksem kui oodatud 100000 (100 * 1000) konkurentsitingimuste tõttu.

Põhjus on see, et inkrementsioonitegevused ei ole atomilised: lugemine, suurendamine ja kirjutamine võivad olla katkestatud teiste korutinite poolt.

Õige tulemuse saamiseks tuleb kasutada sünkroniseerimismehhanisme, näiteks Mutex kotlinx.coroutinesest:

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) // Trükib 100000
}

Ilma sellise kaitseta on lõplik väärtus ettearvamatu.