RFR(xs): 6344935: Clarify Object.wait javadoc with respect to spurious wakeups

David Holmes david.holmes at oracle.com
Fri Aug 11 23:43:09 UTC 2017


On 12/08/2017 5:14 AM, Stuart Marks wrote:
> In general, I'm in favor of ensuring that wording in various bits of the 
> specification is well aligned. I don't see specifically what would need 
> to be improved in this case, though.

If you start trying to align things too much you end up rewriting a heap 
of stuff. I would not be concerned with the differences between 
LockSupport/Condition and Object.wait wording.

If anything should be aligned it is perhaps the awkwardly formed docs 
for wait(long, int) which only lists 2 reasons for waking, then adds 
"and of course interrupt and spurious wakeup can also happen" [sic] That 
is in a way consistent with wait(long) only listing 4 reasons and then 
adding the note about spurious wakeups.

Cheers,
David

>> Can we align the wording with existing wording in either LockSupport or
>> Condition?
> 
> The various LockSupport.park methods have a similar bullet list, and 
> among them is the following:
> 
>      * The call spuriously (that is, for no reason) returns.
> 
> But note this says that the park call returns, whereas the wait call 
> does NOT necessarily return because of spurious wakeup; it's merely 
> removed from the wait set. Thus the proposed text says
> 
>      * Thread <var>T</var> is awakened spuriously. (See below.)
> 
> and subsequent paragraphs talk about removal from wait set, competing to 
> re-acquire the lock, and spurious wakeup.
> 
> 
>> There's also an existing paragraph in Condition that goes "When 
>> waiting upon
>> a Condition, a spurious ... "
> 
> This paragraph from the Condition specification says,
> 
>> When waiting upon a Condition, a "spurious wakeup" is permitted to 
>> occur, in
>> general, as a concession to the underlying platform semantics. This has
>> little practical impact on most application programs as a Condition 
>> should
>> always be waited upon in a loop, testing the state predicate that is 
>> being
>> waited for. An implementation is free to remove the possibility of 
>> spurious
>> wakeups but it is recommended that applications programmers always assume
>> that they can occur and so always wait in a loop.
> 
> whereas the one in Object.wait(long) says:
> 
>> A thread can also wake up without being notified, interrupted, or 
>> timing out,
>> a so-called spurious wakeup. While this will rarely occur in practice,
>> applications must guard against it by testing for the condition that 
>> should
>> have caused the thread to be awakened, and continuing to wait if the
>> condition is not satisfied. In other words, waits should always occur in
>> loops, like this one:
>> 
>>      synchronized (obj) {
>>          while (<condition does not hold>)
>>              obj.wait(timeout);
>>          ... // Perform action appropriate to condition
>>      }
> 
> These mostly say the same thing, though the Condition spec talks about 
> the underlying implementation, whereas the Object.wait spec is strongly 
> oriented toward the application programmer. I think this is ok.
> 
> If there's some bit of wording that needs to be corrected somewhere, 
> please suggest it.
> 
> s'marks
> 


More information about the core-libs-dev mailing list