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
}
ამგვარი დაცვა გარეშე, საბოლოო მნიშვნელობა იქნება გაურკვეველი.