Sobes.tech
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.concurrent paketo 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.