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