Sobes.tech
Junior — Middle
87

Quale sarà il valore della variabile contatore dopo l'esecuzione di 100 coroutine, ognuna delle quali aumenterà il suo valore di 1.000 volte?

Risposta dell'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
}

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