Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > comp.lang.java.programmer > #4864

Re: Making one or more threads wait for another to produce a value or fail

From Tom Anderson <twic@urchin.earth.li>
Newsgroups comp.lang.java.programmer
Subject Re: Making one or more threads wait for another to produce a value or fail
Date 2011-06-01 22:07 +0100
Organization Stack Usenet News Service
Message-ID <alpine.DEB.2.00.1106011232170.3055@urchin.earth.li> (permalink)
References <alpine.DEB.2.00.1105311443530.28134@urchin.earth.li> <HMGdndl85vc2annQnZ2dnUVZ_t2dnZ2d@posted.palinacquisition> <alpine.DEB.2.00.1105311622310.14714@urchin.earth.li> <LIudnSEjsK5AKHjQnZ2dnUVZ_oWdnZ2d@posted.palinacquisition>

Show all headers | View raw


[Multipart message — attachments visible in raw view] - view raw

On Tue, 31 May 2011, Peter Duniho wrote:

> On 5/31/11 8:46 AM, Tom Anderson wrote:
>> On Tue, 31 May 2011, Peter Duniho wrote:
>> 
>>> On 5/31/11 7:00 AM, Tom Anderson wrote:
>>> 
>>>> A Future<Verdict> looks ideal - it provides synchronisation, and a 
>>>> value, and provides the same value to all requesters once it's 
>>>> delivered, and also handles failure and cancellation. But i don't see 
>>>> an easy way to make one for a simple value. There is FutureTask, but 
>>>> that seems more geared to wrapping Callable and Runnable.
>>>> 
>>>> Any suggestions?
>>> 
>>> Personally, I'd just use the Object.wait() and Object.notifyAll()
>>> methods.
>> 
>> That probably is good enough. There are some subtleties: one has to be 
>> aware of the possibility of spurious wakeup, and guard the wait() with 
>> a suitable test; one has to think a bit about ensuring a happens-before 
>> relationship between the setting of the result or exception variables 
>> and their reading;
>
> Spurious wakeup, yes (why people continue to tolerate that in Java, I have no 
> idea…plenty of other APIs with concurrency support don't have that trouble).
>
> Happens-before/after, should come directly from a correct use of the wait() 
> and notifyAll() methods.

Or volatile. Working out when you can use each is one of the challenges.

> In particular, as long as you ensure that the writer doesn't get to 
> arrive at its "synchronized" statement in which it will call notify() 
> until after all the readers have arrived at their wait() statement, 
> you're assured all the readers will see the new value.

That is true, but that's a more stringent requirement than is needed: the 
happens-before relationship is between the writer's lock release, and the 
reader's lock acquisition. The reader's prospective wait must be inside a 
synchronized block, so even if a reader arrives at its wait statement long 
after the writer has called notify() (and unlocked) its lock acquisition 
will mean the writer's actions will have happened-before that moment.

I imagine you knew that, of course, and we're talking slightly at 
cross-purposes.

> Alternatively, maintain a separate "do I really need to wait?" flag that 
> is cleared when the delivered value is set, so that readers don't bother 
> waiting if the value's already been updated.

Yes. Which you need anyway, to deal with the spurious wakeups!

tom

-- 
That must be one of the best things you can possibly do with a piglet,
booze and a cannon. -- D

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Making one or more threads wait for another to produce a value or fail Tom Anderson <twic@urchin.earth.li> - 2011-05-31 15:00 +0100
  Re: Making one or more threads wait for another to produce a value or fail Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2011-05-31 07:14 -0700
    Re: Making one or more threads wait for another to produce a value or fail Tom Anderson <twic@urchin.earth.li> - 2011-05-31 16:46 +0100
      Re: Making one or more threads wait for another to produce a value or fail Deeyana <d.awlberg@hotmail.invalid> - 2011-05-31 19:23 +0000
        Re: Making one or more threads wait for another to produce a value or fail Tom Anderson <twic@urchin.earth.li> - 2011-06-01 22:12 +0100
      Re: Making one or more threads wait for another to produce a value or fail Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2011-05-31 20:45 -0700
        Re: Making one or more threads wait for another to produce a value or fail Patricia Shanahan <pats@acm.org> - 2011-05-31 21:37 -0700
          Re: Making one or more threads wait for another to produce a value or fail Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2011-06-01 07:18 -0700
            Re: Making one or more threads wait for another to produce a value or fail Patricia Shanahan <pats@acm.org> - 2011-06-01 09:01 -0700
        Re: Making one or more threads wait for another to produce a value or fail Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-06-01 16:40 +1200
          Re: Making one or more threads wait for another to produce a value or fail "John B. Matthews" <nospam@nospam.invalid> - 2011-06-01 11:22 -0400
            Re: Making one or more threads wait for another to produce a value or fail Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-06-02 10:15 +1200
              Re: Making one or more threads wait for another to produce a value or fail "John B. Matthews" <nospam@nospam.invalid> - 2011-06-01 21:38 -0400
        Re: Making one or more threads wait for another to produce a value or fail Tom Anderson <twic@urchin.earth.li> - 2011-06-01 22:07 +0100
          Re: Making one or more threads wait for another to produce a value or fail Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2011-06-01 22:46 -0700
  Re: Making one or more threads wait for another to produce a value or fail markspace <-@.> - 2011-05-31 08:26 -0700
    Re: Making one or more threads wait for another to produce a value or fail Tom Anderson <twic@urchin.earth.li> - 2011-05-31 19:13 +0100
  Re: Making one or more threads wait for another to produce a value or fail Patricia Shanahan <pats@acm.org> - 2011-05-31 09:06 -0700
    Re: Making one or more threads wait for another to produce a value or fail Paul Cager <paul.cager@googlemail.com> - 2011-05-31 10:08 -0700
      Re: Making one or more threads wait for another to produce a value or fail Patricia Shanahan <pats@acm.org> - 2011-05-31 10:39 -0700
        Re: Making one or more threads wait for another to produce a value or fail Paul Cager <paul.cager@googlemail.com> - 2011-05-31 16:24 -0700
  Re: Making one or more threads wait for another to produce a value or fail Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-06-01 12:33 +1200
    Re: Making one or more threads wait for another to produce a value or fail "John B. Matthews" <nospam@nospam.invalid> - 2011-06-01 00:38 -0400
  Re: Making one or more threads wait for another to produce a value or fail markspace <-@.> - 2011-06-02 14:10 -0700
    Re: Making one or more threads wait for another to produce a value or fail markspace <-@.> - 2011-06-02 14:25 -0700
    Re: Making one or more threads wait for another to produce a value or fail Patricia Shanahan <pats@acm.org> - 2011-06-02 14:43 -0700

csiph-web