Назад к вопросам
Middle — Middle+
69
Каким образом можно искусственно вызвать состояние взаимной блокировки в системе?
Ответ от нейросети
sobes.tech AI
В Android (и в общем в многопоточных системах) взаимная блокировка (deadlock) возникает, когда два или более потока навсегда ожидают освобождения ресурсов, занятых друг другом.
Искусственно вызвать deadlock можно, если два потока захватывают два ресурса в разном порядке. Например:
final Object resource1 = new Object();
final Object resource2 = new Object();
Thread t1 = new Thread(() -> {
synchronized (resource1) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (resource2) {
// работа с ресурсами
}
}
});
Thread t2 = new Thread(() -> {
synchronized (resource2) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
synchronized (resource1) {
// работа с ресурсами
}
}
});
t1.start();
t2.start();
Здесь t1 захватывает resource1, затем пытается захватить resource2, а t2 наоборот — сначала resource2, потом resource1. Если оба потока успеют захватить первый ресурс до того, как второй освободится, они навсегда заблокируются, ожидая друг друга.
Таким образом, чтобы искусственно вызвать deadlock, нужно:
- Иметь минимум два ресурса (монитора)
- Два потока, которые захватывают эти ресурсы в разном порядке
- Добавить задержку для увеличения шанса одновременного захвата
Это классический пример взаимной блокировки.