Junior — Middle
Jak można zapobiec wzajemnemu blokowaniu dwóch wątków w aplikacji wielowątkowej?
sobes.tech AI
Odpowiedź od AI
Wzajemne blokady (deadlock) występują, gdy dwa lub więcej wątków na zawsze oczekują na zwolnienie zasobów przez siebie nawzajem. Aby zapobiec deadlockom, można użyć następujących podejść:
- Unikać zagnieżdżonych blokad: minimalizować liczbę jednocześnie pozyskiwanych zasobów.
- Ustalić kolejność pozyskiwania zasobów: zawsze pozyskiwać zasoby w tym samym porządku we wszystkich wątkach.
- Używać timeoutów: podczas próby pozyskania blokady, używać timeoutu, aby uniknąć nieskończonego oczekiwania.
- Używać wyższych poziomów synchronizacji: na przykład z pakietu
java.util.concurrentw Androidzie, które zmniejszają prawdopodobieństwo deadlocka.
Przykład uporządkowanego pozyskiwania zasobów:
synchronized (resourceA) {
synchronized (resourceB) {
// praca z zasobami
}
}
Jeśli wszystkie wątki będą przestrzegać kolejności najpierw resourceA, potem resourceB, deadlock nie wystąpi.