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
) и на уровне собственного механизма блокировок класса. Это может привести к:
- нарушению целостности синхронизации;
- состоянию гонки (race condition);
- взаимным блокировкам (deadlock);
- непредсказуемому поведению программы.
Ошибочный код выглядит следующим образом:
Lock lock = new ReentrantLock();
synchronized(lock) {
....
}
Исправленный вариант представлен ниже:
Lock lock = new ReentrantLock();
lock.lock();
try {
....
} finally {
lock.unlock();
}