V6126. Native synchronization used on high-level concurrency class.

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

Данная диагностика классифицируется как: