我们如何维护有界阻塞队列中元素的顺序
How do we maintain order of elements in a Bounded Blocking Queue
根据其定义,队列应该是一种 FIFO 结构。当我们让它阻塞时,这意味着当队列的大小等于队列大小的 MAX_LIMIT 时,多个线程可能会在添加新元素时被阻塞。现在,如果一个元素从队列中出队,我们如何确保第一次等待的线程能够执行。
如果您阅读特定实现的文档,您将例如找到:
-
This class supports an optional fairness policy for ordering waiting producer and consumer threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness set to true
grants threads access in FIFO order. Fairness generally decreases throughput but reduces variability and avoids starvation.
-
没有公平保证。
-
This class supports an optional fairness policy for ordering waiting producer and consumer threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness set to true
grants threads access in FIFO order.
有关常规队列 类 如何处理此问题的摘要,请参阅 。
但我将建议另一种方法/方式来看待这个问题。
您提出了一个线程阻塞的场景,因为它们无法添加到队列中。如果发生这种情况,那么从性能角度来看,最大的问题是被阻塞线程使用/持有的资源和锁。
一般来说,有两种可能的原因:
您在添加和删除队列条目的速率之间存在短期不平衡。这可以通过简单地增加队列边界来解决。
您在添加和删除队列条目的速率之间存在长期不平衡。这只能通过添加更多消费者线程来解决 and/or 删除工作线程。
重点是如果可以让线程不需要阻塞,就不用担心阻塞线程的公平性了。
另一个问题是公平是否真的重要。以严格公平的方式将条目添加到队列中真的很重要吗?它是否影响应用程序的正确性? (用户是否能够知道他们的请求何时被阻止......或超过另一个用户的请求?)
(我可以想象一些要求严格公平的场景。但他们是极少数。)
如果要求严格公平,那么在将请求添加到队列之前发生的请求的处理情况如何。 that 也需要公平吗?因为 JVM 和 OS 不 提供线程调度公平的任何保证。
基本上,让请求处理完全公平是一个棘手的问题。所以对于大多数场景来说,实现FIFO队列提交的严格公平性没有什么意义。
根据其定义,队列应该是一种 FIFO 结构。当我们让它阻塞时,这意味着当队列的大小等于队列大小的 MAX_LIMIT 时,多个线程可能会在添加新元素时被阻塞。现在,如果一个元素从队列中出队,我们如何确保第一次等待的线程能够执行。
如果您阅读特定实现的文档,您将例如找到:
-
This class supports an optional fairness policy for ordering waiting producer and consumer threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness set to
true
grants threads access in FIFO order. Fairness generally decreases throughput but reduces variability and avoids starvation. -
没有公平保证。
-
This class supports an optional fairness policy for ordering waiting producer and consumer threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness set to
true
grants threads access in FIFO order.
有关常规队列 类 如何处理此问题的摘要,请参阅
但我将建议另一种方法/方式来看待这个问题。
您提出了一个线程阻塞的场景,因为它们无法添加到队列中。如果发生这种情况,那么从性能角度来看,最大的问题是被阻塞线程使用/持有的资源和锁。
一般来说,有两种可能的原因:
您在添加和删除队列条目的速率之间存在短期不平衡。这可以通过简单地增加队列边界来解决。
您在添加和删除队列条目的速率之间存在长期不平衡。这只能通过添加更多消费者线程来解决 and/or 删除工作线程。
重点是如果可以让线程不需要阻塞,就不用担心阻塞线程的公平性了。
另一个问题是公平是否真的重要。以严格公平的方式将条目添加到队列中真的很重要吗?它是否影响应用程序的正确性? (用户是否能够知道他们的请求何时被阻止......或超过另一个用户的请求?)
(我可以想象一些要求严格公平的场景。但他们是极少数。)
如果要求严格公平,那么在将请求添加到队列之前发生的请求的处理情况如何。 that 也需要公平吗?因为 JVM 和 OS 不 提供线程调度公平的任何保证。
基本上,让请求处理完全公平是一个棘手的问题。所以对于大多数场景来说,实现FIFO队列提交的严格公平性没有什么意义。