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