If a lock is acquired and released within a method, then it must be released along all execution paths of that method.
Failing to do so will expose the conditional locking logic to the method’s callers and hence be deadlock-prone.
Noncompliant code example
public class MyClass {
public void doSomething() {
Lock lock = new Lock();
lock.lock(); // Noncompliant
if (isInitialized()) {
// ...
lock.unlock();
}
}
}
Compliant solution
public class MyClass {
public void doSomething() {
Lock lock = new Lock();
if (isInitialized()) {
lock.lock();
// ...
lock.unlock();
}
}
}