Sobes.tech
Back to questions
Junior — Middle
69

Какое значение примет переменная-счетчик после запуска 100 корутин, каждая из которых увеличит её значение на 1 тысячу раз?

Answer from 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
}

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