> 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.
[quoted text clipped - 6 lines]
> 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 - 15 Nov 2007 08:56 GMT
> 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.

Signature
Mark Jeffcoat
Austin, TX
yk - 15 Nov 2007 13:24 GMT
> I believe that when you do this:
>
[quoted text clipped - 9 lines]
> 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.
>IllegalMonitorStateException
see
http://mindprod.com/jgloss/runerrormessages.html#ILLEGALMONITORSTATEEXCEPTION

Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com