[concurrency-interest] An article example
David Holmes
dcholmes at optusnet.com.au
Sun Apr 29 21:06:41 EDT 2007
Alex,
They code the wait() in an "if" , instead of a "while" loop.
synchronized(lock) {
if (queue.isEmpty()) {
try {
lock.wait();
} catch (InterruptedException e) {
assert (false);
}
}
current = queue.removeFirst();
}
So two consumers wait because it was empty. The producer does a notifyAll
and so both consumers think there is work to do when there is only one item
in the queue.
Cheers,
David Holmes
> -----Original Message-----
> From: concurrency-interest-bounces at cs.oswego.edu
> [mailto:concurrency-interest-bounces at cs.oswego.edu]On Behalf Of
> Alexandru Popescu ?
> Sent: Monday, 30 April 2007 9:09 AM
> To: userConcurrency
> Subject: [concurrency-interest] An article example
>
>
> Hi all!
>
> I was reading the PrintQueue example in this article:
> http://www-128.ibm.com/developerworks/java/library/j-contest.html.
> Later in the article there is the following comment:
>
> [quote]
> [snip...] and suddenly you'll get a NoSuchElementException thrown by
> LinkedList.removeFirst() in line 24. The bug lurks in the following
> scenario:
>
> 1. Two consumer threads are started, find the queue to be empty,
> and do wait().
> 2. A producer enqueues a task and notifies both consumers.
> 3. One consumer gets the lock, works the task, and leaves the queue
> empty. It then releases the lock.
> 4. The second consumer gets the lock (it can proceed because it was
> notified) and tries to work a task, but now the queue is empty.
> [/quote]
>
> Now this comment kind of confuses me because as far as I can say by
> the end of step3, the queue is indeed empty and the 2nd consumer will
> see this in the condition queue.isEmpty() so it will wait.
>
> Can you please explain what am I missing?
>
> many thanks in advance,
>
> ./alex
> --
> .w( the_mindstorm )p.
> _______________________________________________
> Concurrency-interest mailing list
> Concurrency-interest at altair.cs.oswego.edu
> http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest
More information about the Concurrency-interest
mailing list