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
}
Այս պաշտպանությունից բացի, վերջնական արժեքը անկանխատեսելի կլինի։