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
}
Χωρίς αυτήν την προστασία, η τελική τιμή θα είναι απρόβλεπτη.