@Override public E poll() { if (bypassMode.get()) return backingQueue.poll(); // if that's first step, set local step counter to -1 if (currentStep.get() == null) currentStep.set(new AtomicLong(-1)); // we block until everyone else step forward while (step.get() == currentStep.get().get()) LockSupport.parkNanos(1000L); E object = peek(); // we wait until all consumers peek() this object from queue synchronize(currentConsumers.get()); currentStep.get().incrementAndGet(); // last consumer shifts queue on step further if (state.incrementAndGet() == currentConsumers.get()) { // we're removing current head of queue remove(); numElementsDrained.incrementAndGet(); // and moving step counter further state.set(0); step.incrementAndGet(); } // we wait until all consumers know that queue is updated (for isEmpty()) synchronize(currentConsumers.get()); //log.info("Second lock passed"); // now, every consumer in separate threads will get it's own copy of CURRENT head of the queue return object; }