原子计数器更新与阻塞队列的可见性和顺序

时间:2013-12-12 14:14:16

标签: java concurrency visibility atomic

如果生产者线程将一个对象添加到几个BlockingQueue:s中的一个,并且随后增加一个原子整数。消费者线程是否会在轮询每个BlockingQueue并查找排队对象之前看到递增的整数值?

文档说明在阅读计数器之前有发生在之前的关系。所以我的理解是,消费者线程应该始终在阻塞队列中看到添加的项目。

我有一个困难的错误,好像消费者线程首先看到递增的整数,但他们永远找不到他们轮询的阻塞队列中的任何对象(因为poll为所有队列返回null)。所有生成器线程都遵循“添加到队列然后递增计数器”行为。

或者,没有文档说明为什么你可以从轮询BlockingQueue中获取null,而不是队列为空。

(如果重要的话,我会看到java.util.concurrent.LinkedBlockingQueue。)

1 个答案:

答案 0 :(得分:0)

在这种情况下,before-before关系是在写入原子整数之前发生的队列添加。

为了能够确保关系,一个线程需要知道原子整数已经改变,或者原子整数的值与队列的当前状态之间存在关联。

根据您的描述来判断错误是什么太难了,但简单地读取原子整数值意味着什么,除非您知道它已经改变(或者不依赖于关系)。

至于返回null。如果您调用非等待方法,LinkedBlockingQueue可以返回null。例如,poll是无等待的

  

检索并删除此队列的头部,如果是,则返回null   队列是空的。

take等待队列中存在元素的位置

  

检索并删除此队列的头部,必要时等待,直到元素可用为止。