Junior — Middle
Қиммати тағйирёбандаи ҳисобкунак пас аз оғози 100 корутин, ки ҳар яке арзишашро 1000 маротиба зиёд мекунад, чӣ хоҳад шуд?
sobes.tech AI
Ҷавоб аз AI
Агар 100 корутин ҳамзамон як тағйирёбандаи ҳисобкунакро 1000 маротаба бе ҳамоҳангсозӣ зиёд кунанд, натиҷаи охирин эҳтимолан аз интизоришҳои 100000 (100 * 1000) камтар хоҳад буд, бо сабаби шароити рақобат.
Омили асосӣ ин аст, ки амалиёти зиёдкунӣ атомӣ нест: хондан, зиёд кардан ва навиштан метавонанд аз ҷониби дигар корутинҳо киса шаванд.
Барои ба даст овардани натиҷаи дуруст, бояд механизмҳои ҳамоҳангсозӣ истифода шаванд, масалан, Mutex аз 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) // 100000-ро чоп мекунад
}
Бе ин муҳофизат, натиҷаи охирин номуайян хоҳад буд.