
集合
|
105
线程安全集合
这些可变的集合实例可以由多个线程同时更改。线程安全集合混用了细粒度锁和无锁技
术来确保线程阻塞时间最短(通常根本不会阻塞)。对于许多线程安全集合,集合枚举
创建集合的快照,然后枚举该快照。另外,线程安全集合可以从多个线程安全地访问,
这也是它的主要优点。操作只会在短时间内阻塞代码,前提是存在阻塞。
生产者集合与消费者集合
设计这些可变集合实例旨在让生产者(可能有多个)向集合中推入项,同时让消费者
(也可能有多个)从集合中提取项。因此,它们充当生产者代码和消费者代码之间的桥
梁,并且可以选择限制集合中的项的数量。生产者集合(或消费者集合)可以有一个阻
塞
API
或异步
API
,例如,当集合为空时,受阻塞的生产者集合(或消费者集合)将阻
塞调用它们的消费者线程,直到添加另一项为止。但是,异步生产者集合(或消费者集
合)可以让调用它们的消费者线程异步等待,直至添加另一项。
本章的各节使用了不同的生产者集合(或消费者集合),它们具有不同的优点。表
9-1
整理
了一些集合,我们可以根据具体情况进行选择。
表9-1:生产者集合与消费者集合
特性 通道
BlockingCollection<T> BufferBlock<T>
AsyncProducer-
ConsumerQueue<T>
AsyncCollection<T>
队列语义
✓ ✓ ✓ ✓ ✓
栈
/
背包
语义
✗ ✓ ✗ ✗ ✓
同步
API
✓ ✓ ✓ ✓ ✓
异步
API
✓ ✗ ✓ ✓ ✓
当满载时,
丢弃项
✓ ✗ ✗ ✗ ✗
经过微软
测试
✓ ✓