Может ли ConcurrentLinkedDeque иметь фиксированный размер и перезаписывать старые элементы? - PullRequest
0 голосов
/ 01 июля 2018

Если я правильно понял, ConcurrentLinkedDeque действует как стек, если вы используете pollLast()?

Теперь моя проблема в том, что мне нужен установленный размер ConcurrentLinkedDeque. Мой продюсер не останавливается, так что даже если у меня будет 16 ГБ оперативной памяти, у меня в конце концов закончится. ТАК можно ли установить фиксированный размер?

Моя реализация:

ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>();

Производитель (Тема 1): работает queue.add(line); Потребитель (поток 2): работает queue.pollLast();

Обратите внимание, что оба потока работают в , а истинный цикл . Это из-за требований. Вот почему я использую ConcurrentLinkedDeque, а не ArrayBlockingQueue или SynchronousQueue, потому что он не блокирует.

Также нужно ли мне что-либо объявлять synchronised?

1 Ответ

0 голосов
/ 01 июля 2018

Может ли ConcurrentLinkedDeque иметь фиксированный размер?

Нет, это " неограниченный одновременный Deque на основе связанных узлов."

Нужно ли что-либо объявлять synchronised?

ConcurrentLinkedDeque сам по себе является потокобезопасным. Синхронизация требуется только для составных действий (таких как перезапись старых элементов).

Может ли ConcurrentLinkedDeque перезаписать старые элементы?

Я не думаю, что есть такой метод. Это составное действие, которое требует

  • запоминание положения элемента, который вы собираетесь изменить, и всех элементов, которые идут до / после;
  • изменение элемента;
  • восстановление порядка (возврат элементов).

Эти три действия должны быть выполнены в блоке synchronized.

...