Sobes.tech
Junior — Middle

100 корутин ишке киргизилгандан кийин, алардын ар бири анын маанисин 1000 эсеге көбөйтсө, эсептегич өзгөрмө кандай мааниге ээ болот?

sobes.tech AI

AIден жооп

Эгер 100 корутин бир убакта бир эле санагыч өзгөрмөсүн 1000 жолу көбөйтсө, акыркы мааниси күтүлгөн 100000ден (100 * 1000) азыраак болушу мүмкүн, атаандаштык шарттарынын натыйжасында.

Мунун себеби, көбөйтүү операциялары атомдук эмес: окуу, көбөйтүү жана жазуу башка корутиндер тарабынан үзүлүшү мүмкүн.

Туура натыйжа алуу үчүн, синхрондоштуруу механизмдерин колдонуу керек, мисалы, kotlinx.coroutines'тон Mutex:

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 чыгарат
}

Бул коргоо жок болсо, акыркы мааниси алдын ала айта албайт.