Junior — Middle
Kaip išvengti dviejų sriegių tarpusavio užblokavimo daugiagijų programoje?
sobes.tech AI
Atsakymas iš AI
Tarpusavio blokada (deadlock) įvyksta, kai du ar daugiau sriegių amžinai laukia vienas kito išlaisvinti išteklius. Norint išvengti deadlock'ų, galima naudoti šiuos požiūrius:
- Vengti įdėtinių užraktų: sumažinti vienu metu įgyjamų išteklių skaičių.
- Išteklių įsigijimo tvarką nustatyti: visada įsigyti išteklius toje pačioje tvarkoje visuose sriegiuose.
- Naudoti laiko limitus (timeouts): bandant įsigyti užraktą, naudoti timeout, kad išvengtumėte begalinio laukimo.
- Naudoti aukštesnio lygio sinchronizacijos primitivius: pavyzdžiui, iš
java.util.concurrentpaketo Android'e, kurie sumažina deadlock tikimybę.
Pavyzdys, kaip tvarkingai įsigyti išteklius:
synchronized (resourceA) {
synchronized (resourceB) {
// darbai su ištekliais
}
}
Jei visi sriegi laikosi pirmiausia resourceA, tada resourceB tvarkos, deadlock neįvyks.