首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java.util.ConcurrentLinkedQueue

java.util.ConcurrentLinkedQueue
EN

Stack Overflow用户
提问于 2009-01-12 10:46:40
回答 4查看 14.6K关注 0票数 17

我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列。下面是这个类的javadoc的格式回复信息。

一个基于链接节点的无界线程安全队列。当多个线程共享对一个公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择。此队列不允许使用null元素。

现在假设我在servlet上有1000个并发请求,每个线程都需要在ConcurrentLinkedQueue中加入一个对象。从描述中,我应该得出结论,它在处理负载时不会有问题吗?我需要的保证是:

如果流量负载超过1000个并发请求,synchronization.

  • I将不会丢失任何请求。
  1. 我会自动获得线程安全保证,而不需要自己做。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-12 16:20:53

您实际上提出了三个不同的问题(其中两个是显式的,一个是隐式的)。下面是我的答案:

1.如果使用 java.util.ConcurrentLinkedQueue**?**,是否需要执行自己的同步

并发集合上的原子操作将为您同步。换句话说,对队列的每个单独调用都保证是线程安全的,而无需您执行任何操作。什么是不是保证的线程安全是您在集合上执行的任何非原子操作。

例如,这是threadsafe,不需要您执行任何操作:

代码语言:javascript
复制
queue.add(obj);

代码语言:javascript
复制
queue.poll(obj);

但是,对队列的非原子调用不会自动成为线程安全的。例如,以下操作不是自动线程安全:

代码语言:javascript
复制
if(!queue.isEmpty()) {
   queue.poll(obj);
}

最后一个不是线程安全,因为在调用isEmpty和调用轮询之间,其他线程很可能已经在队列中添加或删除了项。执行此操作的threadsafe方法如下所示:

代码语言:javascript
复制
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加载性能(包括并发类的使用)的唯一方法是在负载下对其进行测试。

票数 60
EN

Stack Overflow用户

发布于 2009-01-12 11:01:13

请记住,对于对单个成员的调用,队列只是threadsafe。不要写这样的代码,并期望它能工作:

代码语言:javascript
复制
if (queue.Count!=0)
    queue.Dequeue().DoSomething();

在这两个操作之间,另一个线程可能已经将最后一个元素出队。我对Java集合并不熟悉,但是我猜在这种情况下的Dequeue会返回null,给你一个异常。

票数 3
EN

Stack Overflow用户

发布于 2009-01-12 10:52:36

  1. 由于队列是线程安全的,因此不需要执行任何同步来确保线程安全。但是,您应该确保所有线程对队列具有相等的访问权限,以避免资源不足、忙碌等待等情况。
  2. 由于队列是无界的,因此队列的大小仅受可用内存量的限制。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/435069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档