Анализатор обнаружил, что в synchronized передан наследник java.util.concurrent.locks.Lock, java.util.concurrent.locks.Condition, java.util.concurrent.locks.ReadWriteLock и/или java.util.concurrent.locks.StampedLock.
Вышеперечисленные классы относятся к классам параллелизма высокого уровня, и их применение в synchronized является ошибочным. Вместо этого следует применять высокоуровневые средства блокировки, предоставляемые самим классом.
Использование synchronized с такими объектами создаёт две независимые системы синхронизации: на уровне монитора объекта (через synchronized) и на уровне собственного механизма блокировок класса. Это может привести к:
Ошибочный код выглядит следующим образом:
Lock lock = new ReentrantLock();
synchronized(lock) {
....
}
Исправленный вариант представлен ниже:
Lock lock = new ReentrantLock();
lock.lock();
try {
....
} finally {
lock.unlock();
}
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки при работе с многопоточными примитивами (интерфейсами запуска потоков на выполнение, синхронизации и обмена данными между потоками и пр.). |
Данная диагностика классифицируется как:
|