Java Coverity 锁定语句无限期等待错误
Java Coverity indefinite wait error on lock statement
Java 相对较新,但负责查看 Coverity 缺陷。这个有我想的那么简单吗? (我无法说服代码所有者。)
50 // this method is used when the program is run as a pojo.
51 public static void main(final String[] args) {
52
53 startProgram();
54
55 // keep this here, for console app, needs to create a loop, but not for AS apps.
56 lock = new Object();
57
loop_outside_lock_insufficient: Because this loop occurs outside the locked region, it cannot be a sufficient check of the wait condition. The value of the wait condition may change between the check of the loop condition and the call to wait.
58 while (!finished) {
lock_acquire: Acquiring lock program.lock.
59 synchronized (lock) {
60 try {
CID 711645 (#1 of 1): Indefinite wait (BAD_CHECK_OF_WAIT_COND)wait_cond_improperly_checked: The wait condition prompting the wait upon program.lock is not checked correctly. This code can wait for a condition that has already been satisfied, which can cause a never-ending wait.
Refactor the code to protect the call to wait with a loop that rechecks the wait condition inside the locked region.
61 lock.wait();
62 } catch (final InterruptedException e) {
63
64 log.error(e.getStackTrace());
65 }
66 }
67 }
68
69 }
我想我只想将其更改为
synchronized(lock)
while(!finished){
try lock.wait();
catch(InterruptedException e)
log.error(e.getStackTrace());
}
这有意义吗?我真的只需要将 while 循环移动到 lock 语句中吗?
您需要将 finished
声明为 volatile
。那你的方案就ok了
Java 相对较新,但负责查看 Coverity 缺陷。这个有我想的那么简单吗? (我无法说服代码所有者。)
50 // this method is used when the program is run as a pojo.
51 public static void main(final String[] args) {
52
53 startProgram();
54
55 // keep this here, for console app, needs to create a loop, but not for AS apps.
56 lock = new Object();
57
loop_outside_lock_insufficient: Because this loop occurs outside the locked region, it cannot be a sufficient check of the wait condition. The value of the wait condition may change between the check of the loop condition and the call to wait.
58 while (!finished) {
lock_acquire: Acquiring lock program.lock.
59 synchronized (lock) {
60 try {
CID 711645 (#1 of 1): Indefinite wait (BAD_CHECK_OF_WAIT_COND)wait_cond_improperly_checked: The wait condition prompting the wait upon program.lock is not checked correctly. This code can wait for a condition that has already been satisfied, which can cause a never-ending wait.
Refactor the code to protect the call to wait with a loop that rechecks the wait condition inside the locked region.
61 lock.wait();
62 } catch (final InterruptedException e) {
63
64 log.error(e.getStackTrace());
65 }
66 }
67 }
68
69 }
我想我只想将其更改为
synchronized(lock)
while(!finished){
try lock.wait();
catch(InterruptedException e)
log.error(e.getStackTrace());
}
这有意义吗?我真的只需要将 while 循环移动到 lock 语句中吗?
您需要将 finished
声明为 volatile
。那你的方案就ok了