我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列。下面是这个类的javadoc的格式回复信息。
一个基于链接节点的无界线程安全队列。当多个线程共享对一个公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择。此队列不允许使用null元素。
现在假设我在servlet上有1000个并发请求,每个线程都需要在ConcurrentLinkedQueue中加入一个对象。从描述中,我应该得出结论,它在处理负载时不会有问题吗?我需要的保证是:
如果流量负载超过1000个并发请求,synchronization.
谢谢
发布于 2009-01-12 16:20:53
您实际上提出了三个不同的问题(其中两个是显式的,一个是隐式的)。下面是我的答案:
1.如果使用 java.util.ConcurrentLinkedQueue
**?**,是否需要执行自己的同步
并发集合上的原子操作将为您同步。换句话说,对队列的每个单独调用都保证是线程安全的,而无需您执行任何操作。什么是不是保证的线程安全是您在集合上执行的任何非原子操作。
例如,这是threadsafe,不需要您执行任何操作:
queue.add(obj);
或
queue.poll(obj);
但是,对队列的非原子调用不会自动成为线程安全的。例如,以下操作不是自动线程安全:
if(!queue.isEmpty()) {
queue.poll(obj);
}
最后一个不是线程安全,因为在调用isEmpty和调用轮询之间,其他线程很可能已经在队列中添加或删除了项。执行此操作的threadsafe方法如下所示:
synchronized(queue) {
if(!queue.isEmpty()) {
queue.poll(obj);
}
}
对队列的Again...atomic调用自动是线程安全的。
2.如果同时有1000个请求,我能保证不会丢失对 java.util.ConcurrentLinkedQueue
的调用吗?
因为这是一个无界的实现,所以您可以保证无论同时发出多少请求,队列都不会丢失这些请求(因为队列的concurrency...you可能会耗尽内存,或者某些such...but队列实现本身不会成为您的限制因素)。在web应用程序中,还有其他“丢失”请求的机会,但队列的同步(或缺乏同步)不会是您的原因。
3. java.util.ConcurrentLinkedQueue
的性能是否足够好?
通常,当我们谈论并发性时,我们谈论的是“正确性”。我的意思是,并发类保证它们是线程安全的(或对死锁、饥饿等的健壮)。当我们谈到这一点时,我们并不是在保证性能(对集合的调用有多快)--我们只是在保证它们是“正确的”。
然而,ConcurrentLinkedQueue是一个“无等待”的实现,所以这可能是您能得到的最好的性能。保证servlet加载性能(包括并发类的使用)的唯一方法是在负载下对其进行测试。
发布于 2009-01-12 11:01:13
请记住,对于对单个成员的调用,队列只是threadsafe。不要写这样的代码,并期望它能工作:
if (queue.Count!=0)
queue.Dequeue().DoSomething();
在这两个操作之间,另一个线程可能已经将最后一个元素出队。我对Java集合并不熟悉,但是我猜在这种情况下的Dequeue会返回null
,给你一个异常。
发布于 2009-01-12 10:52:36
https://stackoverflow.com/questions/435069
复制相似问题