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