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

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

Пример:

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

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

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

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

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

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