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