LockOnBoxedPrimitive
It is dangerous to use a boxed primitive as a lock as it can unintentionally lead to sharing a lock with another piece of code.

Severity
ERROR

The problem

Instances of boxed primitive types may be cached by the standard library valueOf method. This method is used for autoboxing. This means that using a boxed primitive as a lock can result in unintentionally sharing a lock with another piece of code.

Consider using an explicit lock Object instead of locking on a boxed primitive. That is, prefer this:

private final Object lock = new Object();

void doSomething() {
  synchronized (lock) {
    // ...
  }
}

instead of this:

private final Integer lock = 42;

void doSomething() {
  synchronized (lock) {
    // ...
  }
}

Suppression

Suppress false positives by adding the suppression annotation @SuppressWarnings("LockOnBoxedPrimitive") to the enclosing element.