An array-based concurrent shared object implementation has been developed
that provides non-blocking and linearizable access to the concurrent
shared object. In an application of the underlying techniques to a deque,
the array-based algorithm allows uninterrupted concurrent access to both
ends of the deque, while returning appropriate exceptions in the boundary
cases when the deque is empty or full. An interesting characteristic of
the concurrent deque implementation is that a processor can detect these
boundary cases, e.g., determine whether the array is empty or full,
without checking the relative locations of the two end pointers in an
atomic operation.