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