Junior — Middle
Hər biri dəyərini 1000 dəfə artıran 100 korutina işə salındıqdan sonra sayğac dəyişəninin hansı dəyəri alacaq?
sobes.tech Süni İntellekt
AI-dan cavab
Əgər 100 korutin eyni vaxtda sinxronizasiya olmadan eyni sayğac dəyişənini 1000 dəfə artırsa, nəticə ehtimal ki, yarış şəraitləri səbəbindən gözlənilən 100000 (100 * 1000) dən aşağı olacaq.
Bunun səbəbi, artırma əməliyyatlarının atomik olmamasıdır: oxuma, artırma və yazma digər korutinlər tərəfindən kəsilə bilər.
Düzgün nəticə əldə etmək üçün, məsələn, kotlinx.coroutines-dan Mutex kimi sinxronizasiya mexanizmlərindən istifadə etmək lazımdır:
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 çap edəcək
}
Bu qoruma olmadan, son dəyər proqnozlaşdırıla bilməz.