引自:http://ifeve.com/concurrent-collections-1/
并发集合(一)引言
声明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González 译者:许巧辉 校对:方腾飞
在本章中,我们将包含:
- 使用非阻塞线程安全的列表
- 使用阻塞线程安全的列表
- 用优先级对使用阻塞线程安全的列表排序
- 使用线程安全的、带有延迟元素的列表
- 使用线程安全的NavigableMap
- 创建并发随机数
- 使用原子变量
- 使用原子数组
引言
在编程中,数据结构是一种基本的元素。几乎每个程序都使用一个或多个数据结构类型来存储和管理它们的数据。Java API提供了Java集合框架(Java Collections framework),它包括可以用来实现许多不同的数据结构的接口、类和算法,你可以在程序中使用它们。
当你需要在并发程序中使用数据集合时,你必须十分小心的选择实现。大多数集合数并不适合用在并发应用程序中,因为它们没有控制并发访问数据。如果一些并发任务共享一个数据结构,而这个数据结构并不适合用在并发任务中,你将会有数据不一致的错误,这将影响到程序的正确运行。ArrayList类就是这种数据结构的一个例子。
Java提供了你可以在你的并发程序中使用的,而且不会有任何问题或不一致的数据集合。基本上,Java提供两种在并发应用程序中使用的集合:
- 阻塞集合:这种集合包括添加和删除数据的操作。如果操作不能立即进行,是因为集合已满或者为空,该程序将被阻塞,直到操作可以进行。
- 非阻塞集合:这种集合也包括添加和删除数据的操作。如果操作不能立即进行,这个操作将返回null值或抛出异常,但该线程将不会阻塞。
通过本章的指南,你将学习如何使用一些可以用在并发应用程序中的Java集合。这包括:
- 非阻塞列表,使用ConcurrentLinkedDeque类。
- 阻塞列表,使用LinkedBlockingDeque类。
- 用在生产者与消费者数据的阻塞列表,使用LinkedTransferQueue类。
- 使用优先级排序元素的阻塞列表,使用PriorityBlockingQueue类。
- 存储延迟元素的阻塞列表,使用DelayQueue类。
- 非阻塞可导航的map,使用ConcurrentSkipListMap类。
- 随机数,使用ThreadLocalRandom类
- 原子变量,使用AtomicLong和AtomicIntegerArray类