Junior — Middle
Jak zabránit vzájemnému zablokování dvou vláken v vícevláknové aplikaci?
sobes.tech AI
Odpověď od AI
Vzájemná blokace (deadlock) nastává, když dva nebo více vláken navždy čekají na uvolnění zdrojů od sebe navzájem. Abychom předešli deadlockům, můžeme použít následující přístupy:
- Vyhýbat se vnořeným blokacím: minimalizovat počet zdrojů, které jsou současně získávány.
- Řadit získávání zdrojů: vždy získávat zdroje ve stejném pořadí ve všech vláknech.
- Používat časové limity (timeouts): při pokusu o získání zámku použít timeout, aby se zabránilo nekonečnému čekání.
- Používat primitives vyšší úrovně synchronizace: například z balíčku
java.util.concurrentv Androidu, které snižují pravděpodobnost deadlocku.
Příklad řádného získávání zdrojů:
synchronized (resourceA) {
synchronized (resourceB) {
// práce s zdroji
}
}
Pokud všechna vlákna dodržují pořadí nejdříve resourceA, pak resourceB, deadlock nenastane.