The analyzer has detected a call of the 'Thread.sleep(....)' method inside a synchronized block or function.
When calling 'Thread.sleep(....)', the current thread is suspended without releasing the lock on the object's captured monitor. As a result, other threads attempting to synchronize on that object will have to wait idly for the sleeping thread to wake up. This may lead to performance drop and in some cases, even to a deadlock.
Consider the following example:
private final Object lock = new Object();
public void doSomething() {
synchronized(lock) {
....
Thread.sleep(1000);
....
}
}
It is better to use the 'lock.wait(....)' method instead of 'Thread.sleep()' to suspend the current thread for a specified time period and make it release the object's monitor to keep other threads from idling. However, keep in mind that in this case, the thread may be "woken up" before the specified timeout has elapsed. For that reason, you should have some condition checked to make sure that the thread has not been woken up earlier than intended:
private final Object lock = new Object();
public void doSomething() {
synchronized(lock) {
....
while(!ready()) {
lock.wait(1000)
}
....
}
}
This diagnostic rule is classified as:
|
Was this page helpful?
Your message has been sent. We will email you at
If you do not see the email in your inbox, please check if it is filtered to one of the following folders: