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