当前位置:  开发笔记 > 编程语言 > 正文

java.util.ConcurrentLinkedQueue

如何解决《java.util.ConcurrentLinkedQueue》经验,为你挑选了1个好方法。

我想使用java.util.ConcurrentLinkedQueue作为Servlet的非持久队列.这是来自类的javadoc的模糊.

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

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

    我自动收到线程安全保证,而无需自己进行同步.

    如果流量负载超过1000个并发请求,我将不会丢失任何请求.

谢谢



1> Jared..:

你基本上是在问三个不同的问题(其中两个是明确的,一个是隐含的.)在这里,我的答案如下:

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的加载性能(包括使用并发类)的唯一方法是在负载下测试它.


以这种方式同步队列将不会执行您要执行的操作.其他线程仍然可以在队列中轮询/提供,即使您在该块中,除非您同步对队列的所有访问.这样做会使使用ConcurrentLinkedQueue毫无意义.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有