public static boolean isEmpty(IndexedQueue iq)
    {
        // Order matters!
        // Loading consumer before producer allows for producer increments after consumer index is read.
        // This ensures this method is conservative in it's estimate. Note that as this is an MPMC there is
        // nothing we can do to make this an exact method.
        return (iq.lvConsumerIndex() >= iq.lvProducerIndex());
    }
A note to maintainers on index assumptions: in a single threaded world it would seem intuitive to assume:
<pre>
<code>producerIndex >= consumerIndex</code>
</pre>
As an invariant, but in a concurrent, long running settings all of the following need to be considered:
<ul>
    <li> <code>consumerIndex > producerIndex</code> : due to counter overflow (unlikey with longs, but easy to reason)
    <li> <code>consumerIndex > producerIndex</code> : due to consumer FastFlow like implementation discovering the
    element before the counter is updated.
    <li> <code>producerIndex - consumerIndex < 0</code> : due to above.
    <li> <code>producerIndex - consumerIndex > Integer.MAX_VALUE</code> : as linked buffers allow constructing queues
    with more than <code>Integer.MAX_VALUE</code> elements.

</ul>
jctools-core/src/main/java/org/jctools/queues/IndexedQueueSizeUtil.java