Sobes.tech
Junior — Middle

Ποια τιμή θα πάρει η μεταβλητή μετρητής μετά την εκκίνηση 100 κορουτινών, καθεμία από τις οποίες θα αυξήσει την τιμή της 1000 φορές;

sobes.tech AI

Απάντηση από AI

Αν 100 coroutine αυξάνουν ταυτόχρονα μια ίδια μεταβλητή μετρητή 1000 φορές χωρίς συγχρονισμό, η τελική τιμή πιθανότατα θα είναι μικρότερη από τις αναμενόμενες 100000 (100 * 1000) λόγω συνθηκών αγώνα.

Ο λόγος είναι ότι οι λειτουργίες αύξησης δεν είναι ατομικές: η ανάγνωση, η αύξηση και η εγγραφή μπορούν να διακοπούν από άλλες coroutine.

Για να λάβετε σωστό αποτέλεσμα, πρέπει να χρησιμοποιήσετε μηχανισμούς συγχρονισμού, όπως το 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
}

Χωρίς αυτήν την προστασία, η τελική τιμή θα είναι απρόβλεπτη.