Sobes.tech
Назад к вопросам
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, нужно:

  • Иметь минимум два ресурса (монитора)
  • Два потока, которые захватывают эти ресурсы в разном порядке
  • Добавить задержку для увеличения шанса одновременного захвата

Это классический пример взаимной блокировки.