您本质上是在问三个不同的问题(其中两个是明确的,一个是隐含的。)它们是我的答案:
1.如果我使用,我需要自己做同步java.util.ConcurrentLinkedQueue
吗?
并发集合上的原子操作会为您同步。换句话说,对队列的每个单独调用都保证是线程安全的,无需您进行任何操作。不能保证线程安全的是您对集合执行的任何非原子操作。
例如,这是线程安全的,您无需执行任何操作:
queue.add(obj);
或者
queue.poll(obj);
然而; 对队列的非原子调用不是自动线程安全的。例如,以下操作不是自动线程安全的:
if(!queue.isEmpty()) {
queue.poll(obj);
}
最后一个不是线程安全的,因为很有可能在调用 isEmpty 和调用 poll 之间,其他线程会从队列中添加或删除项目。执行此操作的线程安全方式如下:
synchronized(queue) {
if(!queue.isEmpty()) {
queue.poll(obj);
}
}
再次......对队列的原子调用是自动线程安全的。非原子调用不是。
java.util.ConcurrentLinkedQueue
2.如果有1000个并发请求,我是否保证不会丢失呼叫?
因为这是一个无限制的实现,你可以保证无论有多少并发请求,队列都不会丢失这些请求(因为队列的并发性......你可能会用完内存或类似......但是队列实现本身不会成为您的限制因素。)在 Web 应用程序中,还有其他机会“丢失”请求,但队列的同步(或缺乏同步)不会成为您的原因。
3.java.util.ConcurrentLinkedQueue
表现是否足够好?
通常,当我们谈论并发时,我们会谈论“正确性”。我的意思是,并发类保证它们是线程安全的(或者对死锁、饥饿等具有鲁棒性)。当我们谈论这个时,我们并没有对性能做出任何保证(对集合的调用速度有多快)是)——我们只保证它们是“正确的”。
然而; ConcurrentLinkedQueue 是一个“无等待”的实现,所以这可能是你可以获得的性能。保证 servlet 的负载性能(包括使用并发类)的唯一方法是在负载下对其进行测试。