# V6129. Possible deadlock due to incorrect synchronization order between locks.

Анализатор обнаружил потенциальную возможность взаимной блокировки (deadlock) из-за нарушения порядка получения блокировок в разных методах. Это происходит, когда синхронизированные блоки кода захватывают мониторы объектов в разной последовательности. При параллельном выполнении таких методов может возникнуть ситуация, когда два потока бесконечно ожидают друг друга, удерживая разные блокировки.

Пример:

    void foo() {
        synchronized (lock1) {
            synchronized (lock2) {
                ....
            }
        }
    }

    void bar() {
        synchronized (lock2) {
            synchronized (lock1) {
                ....
            }
        }
    }

Если один поток начнёт выполнять `foo()`, захватив сначала `lock1`, а второй поток одновременно запустит `bar()`, взяв `lock2`, то первый поток заблокируется при попытке получить `lock2`, а второй — при ожидании `lock1`. Поскольку каждый удерживает ресурс, нужный другому, возникает взаимная блокировка: потоки навсегда останутся в этом состоянии, если не будет внешнего вмешательства.

Исправленный вариант:

    void foo() {
        synchronized (lock1) {
            synchronized (lock2) {
                ....
            }
        }
    }

    void bar() {
        synchronized (lock1) {
            synchronized (lock2) {
                ....
            }
        }
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).

Данная диагностика классифицируется как:

CWE-833 CERT-LCK07-J