Как мы видим в Java Linked Blocking Queue, метод take() принимает lock/gaurds хвостовой узел перед удалением очереди из очереди. Таким образом, ни один из двух потоков не будет брать один и тот же узел из хвоста. В случае zookeeper все процессы, наблюдающие за корневым узлом очереди, получат уведомление, и все они смогут захватить один и тот же набор узлов и начать обработку одних и тех же узлов.Zookeeper Queue with Lock
Так как же я могу назвать это распределенной очередью. Я говорю о том, как производитель Zookeeper выбирает производителя. http://zookeeper.apache.org/doc/r3.4.1/zookeeperTutorial.html#sc_producerConsumerQueues