Junior — Middle
Ako zabrániť vzájomnému zablokovaniu dvoch vlákien v viacvláknovej aplikácii?
sobes.tech AI
Odpoveď od AI
Vzájomná blokáda (deadlock) nastáva, keď dva alebo viac vlákien navždy čakajú na uvoľnenie zdrojov od seba navzájom. Aby ste predišli deadlockom, môžete použiť nasledujúce prístupy:
- Vyhýbajte sa vnoreným zámkom: minimalizujte počet zdrojov, ktoré sú súčasne získavané.
- Zoradiť získavanie zdrojov: vždy získavajte zdroje v rovnakom poradí vo všetkých vláknach.
- Používajte časové limity (timeouts): pri pokuse o získanie zámku použite timeout, aby ste zabránili nekonečnému čakaniu.
- Používajte primitíva vyššej úrovne synchronizácie: napríklad z balíčka
java.util.concurrentv Android, ktoré znižujú pravdepodobnosť deadlocku.
Príklad správneho získavania zdrojov:
synchronized (resourceA) {
synchronized (resourceB) {
// práca so zdrojmi
}
}
Ak všetky vlákna dodržiavajú poradové poradie najskôr resourceA, potom resourceB, deadlock nenastane.