Sobes.tech
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
}

Այս պաշտպանությունից բացի, վերջնական արժեքը անկանխատեսելի կլինի։