Sobes.tech
Junior — Middle

Cum se poate preveni blocarea reciprocă a două fire într-o aplicație multithread?

sobes.tech AI

Răspuns de la AI

Blocarea mutuală (deadlock) apare atunci când două sau mai multe fire de execuție așteaptă indefinit eliberarea resurselor de către celelalte. Pentru a preveni deadlock-urile, se pot folosi următoarele abordări:

  • Evitarea blocărilor imbricate: minimizarea numărului de resurse achiziționate simultan.
  • Ordonarea achiziției resurselor: întotdeauna achiziționați resursele în aceeași ordine în toate firele.
  • Utilizarea timeout-urilor: la încercarea de a achiziționa o blocare, folosiți un timeout pentru a evita așteptarea infinită.
  • Utilizarea primitive de sincronizare de nivel superior: de exemplu, din pachetul java.util.concurrent în Android, care reduc probabilitatea deadlock-ului.

Exemplu de achiziție ordonată a resurselor:

synchronized (resourceA) {
    synchronized (resourceB) {
        // lucru cu resursele
    }
}

Dacă toate firele respectă ordinea mai întâi resourceA, apoi resourceB, deadlock-ul nu va apărea.