Sobes.tech
Junior — Middle

Kāda būs skaitītāja mainīgā vērtība pēc 100 korutīnu palaišanas, katra no tām palielinās tās vērtību 1000 reizes?

sobes.tech AI

Atbilde no AI

Ja 100 korutīnas vienlaikus palielina vienu un to pašu skaitītāja mainīgo 1000 reižu bez sinhronizācijas, galīgā vērtība, visticamāk, būs mazāka par gaidāmo 100000 (100 * 1000) konkurences apstākļu dēļ.

Iemesls ir tas, ka inkrementa operācijas nav atomiskas: lasīšana, palielināšana un rakstīšana var tikt pārtrauktas ar citām korutīnām.

Lai iegūtu pareizu rezultātu, ir jāizmanto sinhronizācijas mehānismi, piemēram, Mutex no 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) // Izdrukās 100000
}

Bez šādas aizsardzības galīgā vērtība būs nenoteikta.