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
}
Без такой защиты итоговое значение будет непредсказуемым.