У меня есть классическая проблема потоковой передачи событий во входящую очередь второго потока. Только в этот раз меня очень интересует производительность. Чего я хочу достичь:Параллельная и блокирующая очередь в Java
- Я хочу одновременный доступ к очереди, нажатие на устройство, приемник.
- Когда очередь пуста, я хочу, чтобы потребитель блокировал очередь, ожидая производителя.
Моя первая идея состояла в том, чтобы использовать LinkedBlockingQueue
, но вскоре я понял, что это не одновременно, а производительность пострадала. С другой стороны, теперь я использую ConcurrentLinkedQueue
, но все же я оплачиваю wait()
/notify()
на каждую публикацию. Поскольку потребитель, обнаружив пустую очередь, не блокирует, мне нужно синхронизировать и wait()
на блокировке. С другой стороны, производитель должен получить этот замок и notify()
при каждой публикации. В целом, я оплачиваю sycnhronized (lock) {lock.notify()}
в каждой отдельной публикации, даже если это не нужно.
Я думаю, что это необходимо здесь, это очередь, которая является блокирующей и параллельной. Я полагаю, что операция push()
работает так же, как в ConcurrentLinkedQueue
, с дополнительным notify()
к объекту, когда выдвинутый элемент является первым в списке. Такая проверка, я считаю, уже существует в ConcurrentLinkedQueue
, так как нажатие требует соединения со следующим элементом. Таким образом, это будет намного быстрее, чем синхронизация каждый раз на внешней блокировке.
Это что-то вроде этого доступно/разумно?
Почему вы думаете, что java.util.concurrent.LinkedBlockingQueue не является параллельным? Я думаю, что он абсолютно параллелен, и видит его javadoc и исходный код. Но понятия не имею о производительности. – Rorick
См. Также http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one – Vadzim