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.