2013-02-26 40 views
1

我看着ArrayBlockingQueueJava的公平队列

对于fair选项,我可以在构造函数中传递,这是什么意思实际上是公平的?

公平 - 如果为true,则队列对插入时被阻塞的线程的访问或删除时的线程,按先进先出顺序处理;如果为false,则未指定访问订单为 。

从我理解的公平意味着FIFO?不是我所需要的?例如。 1线程不应该继续访问队列?

+0

这意味着什么是在javadoc中描述的。你不明白什么?你准确的问题是什么? – 2013-02-26 09:34:00

+0

@JBNizet,我期待公平的意思是1个线程不应该能够一直访问队列(如果有其他线程在等待)。是不是一个正常的队列按先进先出顺序出队? – 2013-02-26 09:48:16

+1

这就是你用公平的旗帜所能产生的效果。如果线程A从队列中获取一个元素,那么线程B添加一个,然后线程C获得一个线程,线程A将首先被服务,然后是B,然后是C.它与队列中的哪个*元素没有任何关系他们会得到。这取决于队列的类型(优先级,数组等)和所调用的方法。您混淆了队列中元素的顺序以及线程可以调用队列中方法的顺序。 – 2013-02-26 09:55:14

回答

2

FAIR将实施公平调度策略,以允许 实现选择一个。公平调度听起来更好,因为它避免了不幸的线程 可能无限期地延迟的可能性,但是实际上,它提供的好处很少重要,足以证明其产生的大的 开销,它强加在队列的操作。如果未指定公平调度 ,则ArrayBlockingQueue通常会近似公平地运行 ,但无法保证。

Reference with Code

0

公平就是保证FIFO访问。 Java 7将为任何尝试访问队列的线程创建一个队列,当它已经被锁定时。

由于线程排序队列的维护,因此公平队列将比使用阵列阻塞队列的系统中的不公平队列慢得多。如果所有线程都以非常相似的速度进展并不是非常重要,那么保持排队不公平是值得的。

+0

但是不应该是一个正常的队列也是FIFO?还是我误解了一些东西? – 2013-02-26 09:52:23

+1

通常,不会创建队列来访问阵列阻塞队列。相反,尝试访问它的线程会在不同的时间间隔内继续尝试这样做。无论发生哪种情况,都会在获取它之后尝试最先获取arrayblockingqueue的锁,而不是等待最长的线程。 – user2079377 2013-03-02 10:08:10

+0

我认为最后的评论应该是被接受的答案 - 这是最清楚的解释。 – 2017-01-18 22:42:48

0

根据您的问题,您可以定义什么是公平的。你可以说公平是一个线程可以访问资源的时隙。或者,您可以将fair定义为以先入先出的方式访问资源的线程。

FIFO在访问资源的顺序上是公平的。