Параллельная и блокирующая очередь в Java

У меня есть классическая проблема потока, отправляющего события во входящую очередь второго потока. Только на этот раз я очень заинтересован в производительности. Чего я хочу достичь:

I want concurrent access to the queue, the producer pushing, the receiver poping. When the queue is empty, I want the consumer to block to the queue, waiting for the producer.

Моей первой идеей было использоватьLinkedBlockingQueueНо вскоре я понял, что это не одновременно, и производительность пострадала. С другой стороны, теперь я используюConcurrentLinkedQueue, но я все равно плачу заwait() / notify() на каждой публикации. Поскольку потребитель, обнаружив пустую очередь, не блокируется, я должен синхронизировать иwait() на замке. С другой стороны, производитель должен получить эту блокировку иnotify() на каждой публикации. В итоге я плачу за sycnhronized (lock) {lock.notify()} в каждой публикации, даже если она не нужна.

Я думаю, что здесь нужно, это очередь, которая является одновременно и блокирующей Я представляюpush() операция работать как вConcurrentLinkedQueueс дополнительнойnotify() к объекту, когда толкаемый элемент является первым в списке. Такая проверка, я считаю, уже существует вConcurrentLinkedQueue, так как нажатие требует соединения со следующим элементом. Таким образом, это будет намного быстрее, чем синхронизация каждый раз на внешней блокировке.

Является ли что-то подобное доступным / разумным?

Ответы на вопрос(6)

Ваш ответ на вопрос