File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Threads and Synchronization and the fly likes IllegalMonitorStateException Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of EJB 3 in Action this week in the EJB and other Java EE Technologies forum!
JavaRanch » Java Forums » Java » Threads and Synchronization
Bookmark "IllegalMonitorStateException" Watch "IllegalMonitorStateException" New topic
Author

IllegalMonitorStateException

Ana Martin
Greenhorn

Joined: Apr 06, 2009
Posts: 2
Hi,

I have two classes running on different threads and both use the same resource.

"isUpdateNeeded" is the var that I want to update (the lock). The method "setUpdateVar()" change the value of this variable to true and notify the thread "UpdateVar" to use this variable. The issue occurs when notifyAll() is called:

java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll()


Could anyone help me to understand how to lock/unlock properly in this example?



Many thanks in advance




public static void setUpdateVar() {
synchronized (isUpdateNeeded){
while(isUpdateNeeded == true){
try {
isUpdateNeeded.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isUpdateNeeded = true;
isUpdateNeeded.notifyAll();
}
}


private class UpdateVar extends Thread {
boolean isRunning = true;

public void run() {
while(isRunning) {
synchronized (isUpdateNeeded){
if (isUpdateNeeded == true){

isUpdateNeeded = false;

mHandler.post(new Runnable() {
public void run() {
ShowList();
}
});
}
}
}
}
}


Steve Luke
Bartender

Joined: Jan 28, 2003
Posts: 3947
    
  17

I assume isUpdateNeeded is a Boolean (or a boolean that autoboxes to a Boolean). If this is the case, then changing the value from true to false (or vice-versa) actually changes the Object referred to by isUpdateNeeded. IE When true, is is Boolean.TRUE and when false it is Boolean.FALSE, two separate Objects, which means you can't synchronize/notify between them.

To simplify things you should have a separate lock that can't change:



Steve
Ana Martin
Greenhorn

Joined: Apr 06, 2009
Posts: 2
Thanks a lot. It works great with your solution!
Thanks for the explanation
 
jQuery in Action, 2nd edition
 
subject: IllegalMonitorStateException
 
Similar Threads
Question about wait() and notify()
Removing objects (Threads)
Thread and variable value question?
wait in idle mode?
best way to kill ?