У меня есть классическая проблема потока, отправляющего события во входящую очередь второго потока. Только на этот раз я очень заинтересован в производительности. Чего я хочу добиться:
- Я хочу одновременный доступ к очереди, продюсер продвигается, получатель всплывает.
- Когда очередь пуста, я хочу, чтобы потребитель заблокировал очередь, ожидая производителя.
Моей первой идеей было использовать LinkedBlockingQueue
, но вскоре я понял, что это не одновременно, и производительность пострадала. С другой стороны, сейчас я использую ConcurrentLinkedQueue
, но все же я плачу стоимость wait()
/ notify()
на каждую публикацию. Поскольку потребитель, обнаружив пустую очередь, не блокируется, мне приходится синхронизироваться и wait()
на блокировку. С другой стороны, производитель должен получить эту блокировку и notify()
при каждой публикации. В итоге я плачу за
sycnhronized (lock) {lock.notify()}
в каждой публикации, даже если она не нужна.
То, что, я думаю, здесь необходимо, это очередь, которая является одновременно и блокирующей, и параллельной. Я представляю себе операцию push()
для работы, как в ConcurrentLinkedQueue
, с дополнительным notify()
к объекту, когда толкаемый элемент является первым в списке. Такая проверка, я считаю, уже существует в ConcurrentLinkedQueue
, так как нажатие требует соединения со следующим элементом. Таким образом, это будет намного быстрее, чем синхронизация каждый раз на внешней блокировке.
Что-то подобное доступно / разумно?