Вы можете столкнуться с проблемами, если целевая коллекция (та, к которой добавляются результаты) делает что-то «умное». Но поскольку вы обычно сливаете очередь в коллекцию, к которой имеет доступ только один поток, это скорее теоретическая проблема.

ентацияBlockingQueue говорит, что массовые операции не являются потокобезопасными, хотя в нем явно не упоминается метод driTo ().

Реализации BlockingQueue являются поточно-ориентированными. Все методы очередей достигают своих эффектов атомарно, используя внутренние блокировки или другие формы управления параллелизмом. Однако массовые операции Collection addAll, containsAll, retainAll и removeAll не обязательно выполняются атомарно, если в реализации не указано иное. Так что, например, addAll (c) может потерпеть неудачу (выбрасывая исключение) после добавления только некоторых элементов в c.

Документация по методуflowTo () указывает, что коллекция, к которой стекаются элементы BlockingQueue, не может быть изменена потокобезопасным способом. Но в нем ничего не говорится о том, что операция driTo () является поточно-ориентированной.

Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию. Эта операция может быть более эффективной, чем повторный опрос этой очереди. Ошибка при попытке добавить элементы в коллекцию c может привести к тому, что элементы не попадут ни в одну, ни в обе коллекции при возникновении связанного исключения. Попытки истощить очередь до самого себя приводят к IllegalArgumentException. Кроме того, поведение этой операции не определено, если указанная коллекция была изменена во время выполнения операции.

Итак, является ли метод driTo () поточно-ориентированным? Другими словами, если один поток вызвал метод dumpTo () в очереди блокировки, а другой вызвал add () или put () в той же очереди, будет ли состояние очереди согласованным в конце обеих операций?

Ответы на вопрос(1)

Ваш ответ на вопрос