并发队列 - 一般问题(描述和用法)

时间:2009-10-14 14:27:49

标签: java concurrency queue priority-queue

我在掌握并发队列的想法时遇到了一些麻烦。我知道队列是FIFO,或先到先服务,数据结构。

现在,当我们添加并发部分时,我将其解释为线程安全(请告诉我,如果这是不正确的),事情会变得有点模糊。并发性是指各种线程可以添加到队列中,还是从队列中删除(服务项目)的方式?并发是否为这种操作提供了一种排序感?

我非常感谢并发队列功能的一般描述。类似的帖子here并不像我希望的那样普遍。

还有并发优先级队列这样的东西吗?它的用途是什么?

非常感谢您对此主题的任何简短解释或有用的链接。

4 个答案:

答案 0 :(得分:5)

BlockingQueue提供的开销很小的概念是领先一点。获取锁会调用相当大的开销。单独使用上下文切换,我们正在谈论成千上万的指令。不仅如此,一个线程的进度将直接影响另一个线程。现在,它没有几年前那么糟糕,但与非阻塞相比,它是实质性的。

BlockingQueue使用锁定进行互斥

ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQUeue:是三个阻塞队列,而

ConcurrentLinkedQueue,java 1.7 LinkedTransferQueue:使用Michael和Scott,非阻塞队列算法。

在中等到低的争用(更多是真实场景)中,非阻塞队列显着地执行阻塞队列。

并注意史蒂夫关于缺乏瓶颈的评论。在严重争用下,非阻塞算法可以在常量cas尝试上瓶颈,而阻塞将暂停线程。然后,我们看到稍有争用的BlockingQueue会执行非阻塞队列,但这种类型的争用无论如何都不是常态。

答案 1 :(得分:0)

您应该首先查看BlockingQueue接口定义,因为这是使用队列进行线程间通信的基础,并包含实用程序方法,允许生产者和消费者线程以阻塞或非阻塞方式访问队列阻止时尚。这与线程安全访问一起是我对什么构成“并发队列”的理解(虽然我从来没有听说过这个短语 - BlockingQueue只存在于java.util.concurrent包中)。

要回答问题的第二部分,您应该研究的优先级队列实施是PriorityBlockingQueue。如果您的生产者线程正在生成不同优先级的任务(例如来自“普通用户”和“高级用户”的请求)并且您希望控制消费者线程处理任务的顺序,这可能很有用。 。要避免的一个可能的缺陷是由于不断涌入更高优先级的任务而从未从队列中删除的低优先级任务的饥饿。

答案 2 :(得分:0)

我通过“并发”理解队列是线程安全的。这并不意味着它会有效率。但是,我认为Java队列使用无锁实现,这意味着当两个线程同时尝试推送或弹出时,很少或没有任何人。通常发生的是它们在汇编程序级别使用原子锁定,以确保同一对象不能弹出两次。

我曾经写过一个无锁的FIFO队列(在Delphi中),它运行得非常好。使用Critical部分的先前版本的效率要高得多。 CS版本停止运行,尤其是许多线程都试图访问队列。然而,无锁版本没有任何瓶颈,很多线程都会访问它。

答案 3 :(得分:0)

离开这里我认为link to the java.util.concurrent package包含有关此处提出的一些问题的非常重要的信息。

请参阅:并发集合和Memory Consistency Properties