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