Skip to content

Commit f63b157

Browse files
committed
添加上下文链接
1 parent 61d0682 commit f63b157

File tree

6 files changed

+27
-16
lines changed

6 files changed

+27
-16
lines changed

ch14/00_Queues.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](../ch13/02_SortedSet_and_NavigableSet.md)
23

34
# Queues
45

@@ -44,5 +45,5 @@
4445

4546
由于这些方法返回 `null` 以表示队列为空,因此应避免将 `null` 用作队列元素。 通常,`Queue` 接口不鼓励使用 `null` 作为队列元素,并且允许它的唯一标准实现是传统实现 `LinkedList`
4647

47-
48-
48+
《《《 [下一节](01_Using_the_Methods_of_Queue.md) <br/>
49+
《《《 [返回首页](../README.md)

ch14/01_Using_the_Methods_of_Queue.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
2-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](00_Queues.md)
33

44
## 使用队列方法
55

@@ -49,3 +49,5 @@
4949

5050
在下一节中,我们将看看 `Queue` - `Priority Queue``ConcurrentLinkedList` 的直接实现 - 以及 `14.3` 章节中的 `BlockingQueue` 及其实现。这两节中的课程在行为上差异很大。他们大多数是线程安全的;大多数提供阻塞设施(即等待条件的操作适合他们执行);一些支持优先级排序;一个 `DelayQueue` - 保留元素,直到它们的延迟已经过期,另一个 - 同步队列 - 完全是一个同步工具。在队列实现之间进行选择时,这些功能差异会比他们的表现更受影响。
5151

52+
《《《 [下一节](02_Implementing_Queue.md) <br/>
53+
《《《 [返回首页](../README.md)

ch14/02_Implementing_Queue.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
2-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](01_Using_the_Methods_of_Queue.md)
33

44
## 队列的实现
55

@@ -64,3 +64,5 @@
6464

6565
`ConcurrentLinkedQueue``12.3` 节中讨论的两个标准构造函数。它的迭代器很弱一致。
6666

67+
《《《 [下一节](03_BlockingQueue.md) <br/>
68+
《《《 [返回首页](../README.md)

ch14/03_BlockingQueue.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
2-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](02_Implementing_Queue.md)
33

44
## BlockingQueue
55

@@ -212,3 +212,5 @@
212212

213213
`Collection` 方法而言,`SynchronousQueue` 表现得像一个空的 `Collection`; `Queue``BlockingQueue` 方法的行为与您对容量为零的队列的期望值相同,因此它始终为空。 迭代器方法返回一个空的迭代器,其中 `hasNext` 总是返回 `false`
214214

215+
《《《 [下一节](04_Deque.md) <br/>
216+
《《《 [返回首页](../README.md)

ch14/04_Deque.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
2-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](03_BlockingQueue.md)
33

44
## Deque
55

@@ -99,3 +99,5 @@
9999

100100
它具有与 `LinkedBlockingQueue` 类似的性能特征 - 队列插入和删除需要不断的时间和操作,比如包含需要遍历队列的操作,需要线性时间。迭代器是弱一致的。
101101

102+
《《《 [下一节](05_Comparing_Queue_Implementations.md) <br/>
103+
《《《 [返回首页](../README.md)

ch14/05_Comparing_Queue_Implementations.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
2-
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](04_Deque.md)
33

44
## 比较队列实现
55

@@ -19,13 +19,15 @@ ArrayBlockingQueue |O(1) | O(1) | O(1) | O(1)
1919
LinkedBlockingQueue |O(1) | O(1) | O(1) | O(1)
2020
PriorityBlockingQueue |O(log n) | O(1) | O(log n) | O(1)
2121
DelayQueue |O(log n) | O(1) | O(log n) | O(1)
22-
LinkedList |O(1) | O(1) | O(1) |O(1)
23-
ArrayDeque |O(1) | O(1) | O(1) |O(1)
24-
LinkedBlockingDeque |O(1) | O(1) | O(1) |O(1)
22+
LinkedList |O(1) | O(1) | O(1) | O(1)
23+
ArrayDeque |O(1) | O(1) | O(1) | O(1)
24+
LinkedBlockingDeque |O(1) | O(1) | O(1) | O(1)
2525

2626
问题在于你是否需要阻塞方法,就像你通常为生产者 - 消费者问题所做的那样(要么是因为消费者必须通过等待来处理一个空队列,要么是因为想通过限制队列限制对它们的需求,然后生产者有时必须等待)。如果您不需要阻塞方法或队列大小的限制,请选择高效且免等待的 `ConcurrentLinkedQueue`
2727

2828
如果您确实需要阻塞队列,因为您的应用程序需要支持生产者与消费者的协作,请暂停以考虑是否真的需要缓冲数据,或者您是否需要在线程之间安全地交换数据。如果您可以不使用缓冲(通常是因为您确信会有足够的消费者来防止数据堆积),那么 `SynchronousQueue` 是剩余 `FIFO` 阻止实现 `LinkedBlockingQueue``ArrayBlockingQueue` 的有效替代方案。
2929

3030
否则,我们终于留下了这两者之间的选择。如果无法修复队列大小的实际上限,则必须选择 `LinkedBlockingQueue`,因为 `ArrayBlockingQueue` 总是有界的。对于有限使用,您将根据性能在两者之间进行选择。它们在图 `14-1` 中的性能特点是相同的,但这些只是顺序访问的公式;它们在并发使用中的表现是一个不同的问题。正如我们上面提到的,如果超过三个或四个线程正在服务,`LinkedBlockingQueue` 总体上比 `ArrayBlockingQueue` 更好。这符合 `LinkedBlockingQueue` 的头部和尾部被独立锁定的事实,允许同时更新两端。另一方面,`ArrayBlockingQueue` 不必为每个插入分配新的对象。如果队列性能对于您的应用程序的成功至关重要,那么您应该使用对您来说最重要的基准来衡量这两个实现:您的应用程序本身。
3131

32+
《《《 [下一节](../ch15/00_Lists.md) <br/>
33+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)