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



如果生产者线程将一个对象添加到几个BlockingQueue中的一个,然后递增一个原子整数。使用者线程在轮询每个BlockingQueue并找到排队对象之前,会看到递增的整数值吗?

文档中说,在之前与读取计数器之间存在关系。因此,我的理解是,使用者线程应该始终看到阻塞队列中添加的项目。

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

或者,除了队列为空之外,还有一些未记录的原因可以使您从轮询BlockingQueue中返回null。

(如果重要的话,我在java.util.concurrent.LinkedBlockingQueue中看到了这一点。)

在这种情况下,先发生后发生的关系是添加到队列中发生在写入原子整数之前

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

根据你的描述很难判断错误是什么,但简单地读取原子整数的值意味着什么,除非你知道它已经改变了(或者没有改变,这取决于关系)。

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

检索并删除此队列的头,如果队列为空。

其中take将等待队列中存在元素

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

最新更新