По сути, вы задаете три разных вопроса (два из них явно и один неявно.) Вот они с моими ответами:
1. Нужно ли выполнять собственную синхронизацию, если я использую java.util.ConcurrentLinkedQueue
?
Атомарные операции над параллельными коллекциями синхронизируются для вас. Другими словами, каждый отдельный вызов в очереди гарантированно поддерживает поток без каких-либо действий с вашей стороны. То, что не гарантировано поточно-безопасным, это любые неатомарные операции, которые вы выполняете над коллекцией.
Например, это потокобезопасно без каких-либо действий с вашей стороны:
queue.add(obj);
или
queue.poll(obj);
Тем не менее, неатомарные вызовы в очередь не являются автоматически поточно-ориентированными. Например, следующие операции не автоматически поточно-ориентированы:
if(!queue.isEmpty()) {
queue.poll(obj);
}
Этот последний не является потокобезопасным, поскольку вполне возможно, что между временем вызова isEmpty и вызовом опроса времени другие потоки будут добавлять или удалять элементы из очереди. Потоковый способ сделать это выглядит так:
synchronized(queue) {
if(!queue.isEmpty()) {
queue.poll(obj);
}
}
Опять же ... атомарные вызовы в очередь автоматически поточно-ориентированы. Неатомарные звонки - нет.
2. Я гарантированно не потеряю звонки на java.util.ConcurrentLinkedQueue
, если есть 1000 одновременных запросов?
Поскольку это неограниченная реализация, вам гарантировано, что независимо от того, сколько одновременных запросов будет сделано, очередь не потеряет эти запросы (из-за параллелизма очереди ... у вас может быть недостаточно памяти или что-то подобное ... но сама реализация очереди не будет вашим ограничивающим фактором.) В веб-приложении есть и другие возможности «потерять» запросы, но синхронизация (или ее отсутствие) очереди не будет вашей причиной.
3. Будет ли java.util.ConcurrentLinkedQueue
работать достаточно хорошо?
Обычно мы говорим о «правильности», когда говорим о параллелизме. Я имею в виду, что классы Concurrent гарантируют, что они поточнобезопасны (или устойчивы к тупику, голоданию и т. Д.). Когда мы говорим об этом, мы не даем никаких гарантий в отношении производительности (как быстро вызывается коллекция являются) - мы только гарантируем, что они «правильные».
Тем не менее, ConcurrentLinkedQueue - это реализация без ожидания, так что это, вероятно, настолько эффективно, насколько это возможно. Единственный способ гарантировать производительность загрузки вашего сервлета (включая использование параллельных классов) - это проверить его под нагрузкой.