I got the running error exception like this:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Increaser.run(Lock.java:22)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Decreaser.run(Lock.java:39)
Seems like is the Integer class that caused the weird problem,can
anyone tell me how this happens,maybe the autoboxing or something
else?
public class Lock{
Integer i=new Integer("3");
Increaser in=new Increaser();
Decreaser de=new Decreaser();
public static void main(String[] args){
Lock l=new Lock();
l.in.start();
l.de.start();
}
class Increaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i>10){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("increaser waiting");
}
i++;
i.notify();
}
}
}
}
class Decreaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i<=0){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("decreaser waiting");
}
i--;
i.notify();
}
}
}
}
}
> Seems like is the Integer class that caused the weird problem,can
> anyone tell me how this happens,maybe the autoboxing or something
> else?
I believe that when you do this:
Integer i = new Integer(3);
i++;
...that through autoboxing it's equivalent to:
Integer i = new Integer(3);
i = new Integer(i.intValue() + 1);
So you don't use the same object reference at the start and end of
your synchronized block, i.e. the object you synchronize on isn't the
one you notify.
/gordon
--
> Integer i = new Integer(3);
> i = new Integer(i.intValue() + 1);
>
> So you don't use the same object reference at the start and end of
> your synchronized block, i.e. the object you synchronize on isn't the
> one you notify.
>
Exactly correct.
More precisely, this doesn't have anything to do with
autoboxing -- any class that you manipulate by having
your variable point to a new object on every operation
would work the same way.
E.g., with
String s = " stuffs ";
s = s.trim();
The 's' after the assignment in line 2 is not the
same Object as the first 's', so they have entirely
separate monitors.
--
Mark Jeffcoat
Austin, TX
>IllegalMonitorStateException
see
http://mindprod.com/jgloss/runerrormessages.html#ILLEGALMONITORSTATEEXCEPTION
--
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com