我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列.这是来自类的javadoc的模糊.
基于链接节点的无界线程安全队列.当许多线程共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择.此队列不允许null元素.
现在假设我在servlet上有1000个并发请求,每个线程都需要将一个对象嵌入到ConcurrentLinkedQueue中.从描述中,我应该得出结论,处理负载没有问题吗?我需要的保证是:
我自动收到线程安全保证,而无需自己进行同步.
如果流量负载超过1000个并发请求,我将不会丢失任何请求.
谢谢
你基本上是在问三个不同的问题(其中两个是明确的,一个是隐含的.)在这里,我的答案如下:
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个请求,我保证不会丢失电话吗?
因为这是一个无限制的实现,所以保证无论同时发出多少请求,队列都不会丢失这些请求(因为队列的并发性......你可能会耗尽内存或者其他一些......但是队列实现本身不会成为您的限制因素.)在Web应用程序中,还有其他机会"丢失"请求,但队列的同步(或缺少)将不是您的原因.
3. java.util.ConcurrentLinkedQueue
表现是否足够好?
通常,当我们讨论并发性时,我们会讨论"正确性".我的意思是,Concurrent类保证它们是线程安全的(或者可以防止死锁,饥饿等).当我们谈论这个时,我们不会对性能做出任何保证(对集合的调用速度有多快)是) - 我们只保证他们"正确".
然而; ConcurrentLinkedQueue是一个"无需等待"的实现,所以这可能是你可以获得的高效.保证servlet的加载性能(包括使用并发类)的唯一方法是在负载下测试它.