Параллельная и блокирующая очередь в 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
, так как нажатие требует соединения со следующим элементом. Таким образом, это будет намного быстрее, чем синхронизация каждый раз на внешней блокировке.
Является ли что-то подобное доступным / разумным?