Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

weird Integer's moniter state.

2 views
Skip to first unread message

yk

unread,
Nov 15, 2007, 2:21:03 AM11/15/07
to
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();
}
}
}
}
}

Gordon Beaton

unread,
Nov 15, 2007, 2:59:38 AM11/15/07
to
On Wed, 14 Nov 2007 23:21:03 -0800 (PST), yk wrote:
> 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

--

Mark Jeffcoat

unread,
Nov 15, 2007, 3:56:26 AM11/15/07
to
Gordon Beaton <n....@for.email> writes:

> 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

yk

unread,
Nov 15, 2007, 8:24:14 AM11/15/07
to
> 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.

Roedy Green

unread,
Nov 15, 2007, 6:15:17 PM11/15/07
to
On Wed, 14 Nov 2007 23:21:03 -0800 (PST), yk <ykr...@gmail.com>
wrote, quoted or indirectly quoted someone who said :

>IllegalMonitorStateException

see
http://mindprod.com/jgloss/runerrormessages.html#ILLEGALMONITORSTATEEXCEPTION
--
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

0 new messages