JAVA.WAIT.IN.LOOP

Always invoke wait() and await() methods inside a loop

Vulnerability and risk

To ensure a wait() condition predicate is validated, the validation must take place after the response notification is received.

Mitigation and prevention

Ensure that wait() calls are made with a loop to ensure validation once the response notification is made.

Vulnerable code example 1

Copy
package com.klocwork;

public class JAVA_WAIT_IN_LOOP_POSITIVE_1 {
    public void test1(Object obj) throws InterruptedException {
        obj.wait();
    }
}

Vulnerable code example 2

Copy
package com.klocwork;

import java.util.concurrent.locks.Condition;

public class JAVA_WAIT_IN_LOOP_POSITIVE_2 {
    public void test1(Condition condition) throws InterruptedException {
        condition.await();
    }
}

Fixed code example

Copy
package com.klocwork;

import java.util.concurrent.locks.Condition;

public class JAVA_WAIT_IN_LOOP_NEGATIVE {
    public void test1(Object obj, Condition condition) throws InterruptedException {
        for (;;) {
            obj.wait();
            condition.await();
        }
    }

    public void test2(Object obj, Condition condition) throws InterruptedException {
        do {
            obj.wait();
            condition.await();
        } while (true);
    }
    
    public void test3(Object obj, Condition condition) throws InterruptedException {
        while (true) {
            obj.wait();
            condition.await();
        }
    }
}

External guidance