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

Без тази защита, крайната стойност ще бъде непредсказуема.