Re: JavaMemoryModel: Prioritizing IE without notifyAll().

From: Sylvia Else (sylviae@optushome.com.au)
Date: Sat Nov 22 2003 - 23:02:28 EST


At 07:54 PM 22/11/2003 -0500, Doug Lea wrote:

>Sylvia,
>
>I admire your persistence. Especially since it sometimes it pays off!

Thanks, Doug, though whether it's persistence (a virtue), or just being
plain stubborn (a vice), I don't know.

Anyway, as has probably been apparent all along, my main target has been
spurious wakeups.

For my proposal, or your more elegant variant of it, to work, it's a
prerequisite that an interrupted thread know whether or not it was woken by
a notify. I cannot imagine an implementation in which the thread does not
know immediately prior to the interrupt whether it was woken by a notify,
but does know sometime afterwards. From this I conclude that any
implementation that uses this approach to avoid using notifyAll() for
interrupted threads will, at the point where it is about to return from
wait, be in one of the following waking states that are distinguishable by
the thread.

         1) Not notified, and timer has not expired
           2) Not notified, timer has not expired, but thread interrupted.
         3) Not notified, timer has expired
           4) Not notified, timer has expired, and thread interrupted.
         5) Notified, and timer has expired.
           6) Notified, and timer has expired, and thread interrupted.
         7) Notified, and timer has not expired.
           8) Notified, and timer has not expired, and thread interrupted.

In cases 2, 4, 6, 8 the method throws Interrupted Exception.
In cases 3, 5, 7 the method returns normally.

Which leaves only case 1, which represents a spurious wakeup from some
unknown source. But since the wakeup is recognisably spurious, then the
wait() method should loop back and try again.

Maybe another algorithm exists that allows interrupted threads to avoid
notifyAll(), without knowing whether or not the interrupted thread was
notified....but I'm sceptical.

This appears to mean that any implementation that needs to be allowed to
perform spurious wakeups is also going to use the sledgehammer approach of
notifyAll for interrupted threads.

Has the balance now shifted in favour of disallowing spurious wakeups.

Sylvia.

-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel



This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:00:54 EDT