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.