Middle+
Kaip veikia mutex korutinuose?
sobes.tech AI
Atsakymas iš AI
Mūtuoklis (Mutex) korutinose suteikia tarpusavio išimties mechanizmą, skirtą apsaugoti bendrus išteklius nuo vienalaikio kelių korutinų prieigos.
Veikimo principas:
- Mūtuoklio užfiksavimas: Korutina, kuri nori gauti prieigą prie apsaugoto ištekliaus, iškviečia metodą
lock(). - Blokavimas: Jei mūtuoklis laisvas, korutina jį užfiksuoja neblokiruojamai ir tęsia vykdymą. Jei mūtuoklis užimtas kita korutina, kviečianti korutina sustoja iki kol mūtuoklis bus atlaisvintas.
- Mūtuoklio atlaisvinimas: Baigus darbą su apsaugotu ištekliu, korutina iškviečia metodą
unlock(), kad atlaisvintų mūtuoklį.
Pagrindinės korutinų ypatybės:
- Neblokiruojantis
lock()(kai laisvas mūtuoklis): Skirtingai nuo tradicinių srautų, kurlock()gali blokuoti visą srautą, korutinose, jei mūtuoklis laisvas, užfiksavimas vyksta neblokiruojamai. - Korutinos sustabdymas (kai užimtas mūtuoklis): Jei mūtuoklis užimtas, kviečianti korutina nesustabdo srauto, o sustabdomas iki kol mūtuoklis bus atlaisvintas. Tai leidžia kitoms korutinoms vykdyti.
withLockplėtros funkcija: Patogus būdas naudoti mūtuoklį, kuris automatiškai jį užfiksuoja ir atlaisvina, net jei blokas viduje įvyksta išimtis.
Pavyzdys:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Kritinė sekcija - apsaugotas išteklius
counter++
delay(10) // Imituoja darbą
println("Counter: $counter")
} // Mūtuoklis automatiškai atlaisvinamas čia
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
Šiame pavyzdyje incrementCounter yra kritinė sekcija, kuri keičia bendrą išteklių counter reikšmę. Mūtuoklis užtikrina, kad tik viena korutina vienu metu turės prieigą prie šios sekcijos, užkertant kelią lenktynių sąlygoms. withLock naudojimas palengvina mūtuoklio valdymą.