2

这是ConcurrentLinkedQueue文档的描述:

基于链接节点的无界线程安全队列。此队列对元素进行 FIFO(先进先出)排序。
...
此实现采用高效的“无等待”算法

是否有可能无界 无需等待
我很确定等待自由确保了对任何操作的限制。

4

2 回答 2

8

我很确定等待自由确保了对任何操作的限制。

操作所花费的时间(或指令数量,或其他)的界限。

在那个 JavaDoc 中,“无界”可能是指队列可能包含的元素数。

例如,LinkedBlockingDeque 的 JavaDoc写道

基于链接节点的可选有界阻塞双端队列。

可选的容量绑定构造函数参数用作防止过度扩展的一种方式。容量(如果未指定)等于 Integer.MAX_VALUE。链接节点在每次插入时动态创建,除非这会使双端队列超出容量。

于 2012-04-12T21:19:59.290 回答
2

无等待实际上只是意味着在有限数量的步骤内,操作将按照说明完成

如果每个操作都限制了算法在操作完成之前将采取的步数,则该算法是无等待的

此定义不适用于ConcurrentLinkedQueue. 在轮询(或放入)队列时,每个线程都有可能无限次失败。仅这一事实就告诉我们队列并不是真正的空闲等待。我相信作者没有使用 Herlihy 在 The Art of Multiprocessor Programming 中对无等待的定义。

有关更多信息,CLQ 使用 Michael & Scott 算法,此处解释

编辑:刚刚意识到我为 M 和 S 队列提供的链接也在 API 中。两者都应该没问题。

于 2012-04-12T21:09:19.780 回答