【问题标题】:concurrent queue - general question (description and usage)并发队列 - 一般问题(描述和用法)
【发布时间】:2010-12-06 16:51:53
【问题描述】:

我很难理解并发队列的概念。我理解队列是一个先进先出或先到先得的数据结构。

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

我非常感谢对并发队列功能的一般描述。类似的帖子here 并没有我希望的那么笼统。

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

非常感谢您提供有关此主题的任何简短说明或有用的链接。

【问题讨论】:

    标签: java concurrency queue priority-queue


    【解决方案1】:

    BlockingQueue 提供的开销很小的概念有点过头了。获取锁会调用相当大的开销。仅与上下文切换我们就在谈论数千条指令。不仅如此,一个线程的进度也会直接影响另一个线程。现在,它不像几年前那么糟糕,但与非阻塞相比,它是可观的。

    BlockingQueue 使用锁实现互斥

    ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue:是三个阻塞队列的while

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

    在中度到低度争用情况下(这更像是真实世界的场景),非阻塞队列的性能明显优于阻塞队列。

    并注意史蒂夫关于缺乏瓶颈的评论。在激烈的争用下,非阻塞算法可能会限制不断的 cas 尝试,而阻塞会暂停线程。然后我们看到,在激烈争用下的 BlockingQueue 在执行非阻塞队列时略胜一筹,但这种争用类型无论如何都不是常态。

    【讨论】:

      【解决方案2】:

      我通过“并发”理解队列是线程安全的。这并不意味着它将是有效的。但是,我想 Java 队列使用无锁实现,这意味着当两个线程同时尝试推送或弹出时,几乎没有或没有惩罚。通常发生的情况是,它们在汇编程序级别使用原子锁定,以确保同一对象不会被弹出两次。

      我曾经写过一个无锁 FIFO 队列(在 Delphi 中),效果很好。比使用关键部分的先前版本更有效。 CS 版本停止运行,尤其是在许多线程都试图访问队列的情况下。然而,无锁版本没有瓶颈,尽管有很多线程访问它。

      【讨论】:

      • 获取锁以修改线程安全的队列实现会增加很少的开销,并且 java.util.concurrent 包中的所有 BlockingQueue 实现都将使用至少一个锁(有些使用两个用于放置/获取)。没有锁,生产者/消费者无法执行阻塞的 put/takes 和批量操作(例如 drainTo)不能以原子方式完成。
      【解决方案3】:

      您应该首先检查BlockingQueue 接口定义,因为这是使用队列在线程之间进行通信的基石,并且包含允许生产者和消费者线程以阻塞或非阻塞方式访问队列的实用方法.这与线程安全访问一起是我对构成“并发队列”的理解(尽管我从未听说过这个短语 - BlockingQueue 仅存在于 java.util.concurrent 包中)。

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

      【讨论】:

        【解决方案4】:

        在这里留下一个link to the java.util.concurrent package,我认为它包含关于这里提出的一些问题的非常重要的信息。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-05
          • 2015-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2020-06-18
          • 1970-01-01
          相关资源
          最近更新 更多