Ответ 1
В основном вы задаете три разных вопроса (два из них явно и одно неявно). Вот они, с моими ответами:
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 одновременных запросов?
Поскольку это неограниченная реализация, вам гарантировано, что независимо от количества одновременных запросов очередь не потеряет эти запросы (из-за очереди concurrency... у вас может закончиться нехватка памяти или некоторых таких... но сама реализация очереди не будет вашим ограничивающим фактором.) В веб-приложении есть другие возможности "потерять" запросы, но синхронизация (или их отсутствие) очереди не будет вашей причиной.
3. Будет ли java.util.ConcurrentLinkedQueue
работать достаточно хорошо?
Обычно мы говорим о "правильности", когда говорим о concurrency. Я имею в виду, что параллельные классы гарантируют, что они потокобезопасны (или надежны против блокировки, голодания и т.д.). Когда мы говорим об этом, мы не делаем никаких гарантий относительно производительности (как быстро звонки в коллекцию ) - мы только гарантируем, что они "правильны".
Тем не менее; ConcurrentLinkedQueue - это "безжизненная" реализация, поэтому это, вероятно, так же хорошо, как вы можете получить. Единственный способ гарантировать загрузку сервлета (включая использование параллельных классов) - проверить его при загрузке.