Sobes.tech
Junior — Middle
86

100 корутин іске қосылғаннан кейін, олардың әрқайсысы оның мәнін 1-ге көбейтсе, есептегіш айнымалы қандай мән алады?

AI-дан жауап

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

Без такой защиты итоговое значение будет непредсказуемым.