[concurrency-interest] Re: Unbounded blocking queues
dawidk at mathcs.emory.edu
Mon Oct 10 13:08:59 EDT 2005
Doug Lea wrote:
> Calum MacLean wrote:
>> Hi Doug
>> I was thinking of implementations other than linked-list style. For
>> example, there's an ArrayBlockingQueue, which would presumably take
>> up less memory, but that's fixed capacity.
>> I'm wondering if there's any middle ground - unbounded, but minimal
> I think that Dawid Kurzyniec might have once put together something
> along these lines but I don't see it anywhere offhand.
dynamically growing array-based blocking queue, DynamicArrayBlockingQueue:
> But it is on average unlikely that an array will save memory:
This is true, but the array-based implementation can save the day if you
care only about the peek memory usage, not the average one. For
instance, if you have occassional bursts and you want to avert
Also, it is possible to modify the DynamicArrayBlockingQueue so that it
shrinks back when emptied; this requires reasonable application-specific
heuristics though so I didn't put that functionality in the general
version. Perhaps the "compact()" method would do?
DynamicArrayBlockingQueue does not allow concurrent reads and writes, so
it is more prone to congestion than LinkedBlockingQueue. I am guessing
this should not happen a lot in a single-producer-single-consumer
scenario though, since the accessor methods are very brief. But I did
not measure this.
Both LinkedBlockingQueue and DynamicArrayBlockingQueue have a practical
capacity limit of 2^31-1. Current implementation of
DynamicArrayBlockingQueue may not handle overflow past that value
gracefully. (Although you would almost surely see OutOfMemoryError first).
More information about the Concurrency-interest