SynchronousQueue公平

时间:2009-10-08 10:28:14

标签: java concurrency synchronization

我正在使用SynchronousQueue在我的应用中使用1producer-1consumer设计。到现在为止,我正在使用默认构造函数(fair = true)。而且我想知道“公平=错误”会对系统产生什么影响(性能和特殊的并发行为)。

  

这里的文档告诉我们:

     

的SynchronousQueue

     

public SynchronousQueue()

Creates a SynchronousQueue with nonfair access policy.
     

的SynchronousQueue

     

public SynchronousQueue(boolean fair)

Creates a SynchronousQueue with the specified fairness policy.

Parameters:
    fair - if true, waiting threads contend in FIFO order for
     

访问;否则订单是   未指定的。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的问题或多或少包含答案。无论如何,简短的回答是它会在你的单一消费者案例中产生无效差异(可能会有无限小的性能下降)。

如果您将fair标志设置为true,那么当您在问题中粘贴时,等待线程将按FIFO顺序进行竞争以进行访问。这对等待线程的调度设置了特定的限制,以确定它们如何被重新唤醒;不公平的系统没有这样的约束(因此编译器/运行时可以自由地执行可能运行得更快的事情)。

请注意,这只会影响选择哪个线程从正在等待的线程集中唤醒;并且只有一个线程会等待,决策算法无关紧要,因为它总是选择相同的线程。当你有多个线程在等待时就会出现这种区别 - 只要其他线程能够处理它们之间的整个工作负载,一个单独的线程是否可以永远从队列中获取任何东西?

答案 1 :(得分:1)

WRT。性能,你试过测量这个吗?它很可能会给你更多关于发生了什么的指示,而不是任何答案。

来自the doc

  

公平性普遍下降   吞吐量,但减少变化和   避免饥饿

但是进行可重复的测试并研究会对您和您的特定情况产生多大影响会很有趣。由于您只有一个消费者线程,我认为它不会影响您的应用程序(可能)一个小的(可能难以察觉的)性能下降。但我要重申,你应该尝试衡量它。