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 как критические и относятся к типу: Ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.).

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