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