weird Integer's moniter state.

Y

yk

HI there,I ran into a really weird problem today,I wrote the code when
I'm trying to get my Producer-Consumer-model running.

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();
}
}
}
}
}
 
G

Gordon Beaton

HI there,I ran into a really weird problem today,I wrote the code when
I'm trying to get my Producer-Consumer-model running.

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?

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

--
 
M

Mark Jeffcoat

Gordon Beaton said:
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.
 
Y

yk

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.
Thanks for your reply,gordon.Not realizing the Integer is quite
similar to String in this kind of condition that make me so confused.
BTW:I really appreciate your example,Mark.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top