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
}

ამგვარი დაცვა გარეშე, საბოლოო მნიშვნელობა იქნება გაურკვეველი.