Sobes.tech
Junior — Middle

100 ta korutina ishga tushirilgandan so'ng, har biri uning qiymatini 1000 marta oshiradigan hisoblagich o'zgaruvchisi qanday qiymat oladi?

sobes.tech AI

AIdan javob

Agar 100 korutin bir vaqtning o'zida bir xil hisoblagich o'zgaruvchisiga 1000 marta oshirishni amalga oshirsa, yakuniy qiymat ehtimoliy ravishda kutilgan 100000 (100 * 1000) dan kam bo'ladi, chunki raqobat sharoitlari mavjud.

Buning sababi, inkrement operatsiyalari atomik emas: o'qish, oshirish va yozish boshqa korutinlar tomonidan to'xtatilishi mumkin.

To'g'ri natijaga erishish uchun, masalan, kotlinx.coroutines'dan Mutex kabi sinxronizatsiya mexanizmlaridan foydalanish kerak:

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 ni chiqaradi
}

Bunday himoya bo'lmasa, yakuniy qiymat oldindan aytib bo'lmaydi.