包 java.util.concurrent
java.util.concurrent.locks
和 java.util.concurrent.atomic
包。
Executors
接口。Executor
是一个简单的标准化接口,用于定义自定义类线程子系统,包括线程池、异步 I/O 和轻量级任务框架。根据使用的具体 Executor 类,任务可能在新创建的线程、现有任务执行线程或调用 execute
的线程中执行,并且可能顺序执行或并发执行。 ExecutorService
提供了更完善的异步任务执行框架。 ExecutorService 管理任务的排队和调度,并允许受控关闭。 ScheduledExecutorService
子接口和相关接口增加了对延迟和周期性任务执行的支持。 ExecutorServices 提供方法来安排异步执行任何表示为 Callable
的函数,它是 Runnable
的结果承载类比。 Future
返回函数的结果,允许确定执行是否已完成,并提供取消执行的方法。 RunnableFuture
是一个 Future
,它拥有一个 run
方法,该方法在执行时设置其结果。
实施。类 ThreadPoolExecutor
和 ScheduledThreadPoolExecutor
提供可调的、灵活的线程池。 Executors
类为最常见的执行器类型和配置提供工厂方法,以及一些使用它们的实用方法。其他基于 Executors
的实用程序包括具体类 FutureTask
提供 Futures 的通用可扩展实现,以及 ExecutorCompletionService
,它有助于协调异步任务组的处理。
类 ForkJoinPool
提供了一个执行器,主要用于处理 ForkJoinTask
及其子类的实例。这些类采用工作窃取调度程序,为符合计算密集型并行处理中通常存在的限制的任务实现高吞吐量。
队列
ConcurrentLinkedQueue
类提供了一个高效的可扩展线程安全非阻塞 FIFO 队列。 ConcurrentLinkedDeque
类类似,但还支持 Deque
接口。
java.util.concurrent
中的五个实现支持扩展的 BlockingQueue
接口,它定义了 put 和 take 的阻塞版本:LinkedBlockingQueue
、ArrayBlockingQueue
、SynchronousQueue
、PriorityBlockingQueue
和 DelayQueue
。不同的类涵盖了生产者-消费者、消息传递、并行任务处理和相关并发设计的最常见使用上下文。
扩展接口 TransferQueue
和实现 LinkedTransferQueue
引入同步 transfer
方法(以及相关功能),其中生产者可以选择阻塞等待其消费者。
BlockingDeque
接口扩展了 BlockingQueue
以支持 FIFO 和 LIFO(基于堆栈)操作。类 LinkedBlockingDeque
提供了一个实现。
定时
TimeUnit
类提供了多种粒度(包括纳秒)来指定和控制基于超时的操作。除了无限期等待之外,包中的大多数类都包含基于超时的操作。在所有使用超时的情况下,超时指定方法在指示其超时之前应等待的最短时间。实现会尽最大努力在超时发生后尽快检测到超时。但是,在检测到超时和线程在该超时后实际再次执行之间可能会经过不确定的时间量。所有接受超时参数的方法都将小于或等于零的值视为根本不等待。要“永远”等待,您可以使用值 Long.MAX_VALUE
。
同步器
五类辅助常见的特殊用途同步习惯用法。Semaphore
是一个经典的并发工具。CountDownLatch
是一个非常简单但非常常用的实用程序,用于阻塞直到给定数量的信号、事件或条件成立。CyclicBarrier
是可重置的多路同步点,在某些风格的并行编程中很有用。Phaser
提供了一种更灵活的屏障形式,可用于控制多线程之间的分阶段计算。Exchanger
允许两个线程在会合点交换对象,并且在多个管道设计中很有用。
并发集合
除队列外,此包还提供专为在多线程上下文中使用而设计的集合实现:ConcurrentHashMap
、ConcurrentSkipListMap
、ConcurrentSkipListSet
、CopyOnWriteArrayList
和 CopyOnWriteArraySet
。当预期许多线程访问给定集合时,ConcurrentHashMap
通常优于同步的 HashMap
,ConcurrentSkipListMap
通常优于同步的 TreeMap
。当预期的读取和遍历次数大大超过列表的更新次数时,CopyOnWriteArrayList
优于同步的 ArrayList
。
与此包中的某些类一起使用的“并发”前缀是一种简写,表示与类似的“同步”类的一些差异。例如 java.util.Hashtable
和 Collections.synchronizedMap(new HashMap())
是同步的。但是 ConcurrentHashMap
是“并发”的。并发集合是线程安全的,但不受单个排他锁的约束。在 ConcurrentHashMap 的特殊情况下,它安全地允许任意数量的并发读取以及大量并发写入。当您需要通过单个锁阻止对集合的所有访问时,“同步”类会很有用,但代价是可扩展性较差。在其他需要多个线程访问公共集合的情况下,“并发”版本通常更可取。当集合未共享或仅在持有其他锁时才可访问时,非同步集合更可取。
大多数并发 Collection 实现(包括大多数队列)也不同于通常的 java.util
约定,因为它们的 迭代器 和 Spliterators 提供 weakly consistent 而不是快速失败遍历:
- 他们可以与其他操作同时进行
- 他们永远不会扔
ConcurrentModificationException
- 它们保证在构造时只遍历元素一次,并且可能(但不保证)反映构造后的任何修改。
内存一致性属性
第十七章Java 语言规范定义了发生之前内存操作的关系,例如共享变量的读取和写入。只有当写操作发生时,一个线程的写入结果才能保证对另一个线程的读取可见发生之前读取操作。synchronized
和 volatile
构造,以及 Thread.start()
和 Thread.join()
方法,可以形成发生之前关系。尤其:
- 线程中的每个动作发生之前该线程中的每个动作都按程序的顺序出现。
- 监视器的解锁(
synchronized
块或方法退出)发生之前同一监视器的每个后续锁(synchronized
块或方法条目)。而且因为发生之前关系是可传递的,一个线程在解锁之前的所有动作发生在之前任何锁定该监视器的线程之后的所有操作。 - 写入
volatile
字段发生之前同一字段的每次后续读取。volatile
字段的写入和读取与进入和退出监视器具有相似的内存一致性效果,但 not 需要互斥锁定。 - 在线程上调用
start
发生之前启动线程中的任何操作。 - 线程中的所有操作发生在之前任何其他线程从该线程上的
join
成功返回。
java.util.concurrent
及其子包中所有类的方法将这些保证扩展到更高级别的同步。尤其:
- 将对象放入任何并发集合之前线程中的操作发生在之前在另一个线程中从集合中访问或删除该元素之后的操作。
- 在将
Runnable
提交给Executor
之前线程中的操作发生在之前它的执行开始。同样,Callables
提交给ExecutorService
。 - 由
Future
表示的异步计算所采取的操作发生在之前在另一个线程中通过Future.get()
检索结果后的操作。 - “释放”同步器方法之前的操作,例如
Lock.unlock
、Semaphore.release
和CountDownLatch.countDown
发生在之前在另一个线程中的同一同步器对象上成功“获取”方法(例如Lock.lock
、Semaphore.acquire
、Condition.await
和CountDownLatch.await
)之后的操作。 - 对于通过
Exchanger
成功交换对象的每对线程,每个线程中exchange()
之前的操作发生在之前那些在另一个线程中对应的exchange()
之后。 - 调用
CyclicBarrier.await
和Phaser.awaitAdvance
(及其变体)之前的操作发生在之前屏障动作执行的动作,以及屏障动作执行的动作发生在之前从其他线程中相应的await
成功返回后的操作。
- 看Java 语言规范:
-
17.4.5 先于顺序发生
- 自从:
- 1.5
-
类描述提供
ExecutorService
执行方法的默认实现。由数组支持的有界 阻塞队列。BlockingDeque <E>Deque
还支持阻塞操作,在检索元素时等待双端队列变为非空,并在存储元素时等待双端队列中的空间可用。BlockingQueue <E>Queue
还支持在检索元素时等待队列变为非空的操作,并在存储元素时等待队列中的空间可用。当线程试图等待处于中断状态或在线程等待时进入中断状态的屏障时抛出异常。Callable <V>返回结果并可能抛出异常的任务。异常指示无法检索产生值的任务的结果,例如FutureTask
,因为该任务已被取消。AFuture
可以显式完成(设置其值和状态),并可以用作CompletionStage
,支持在其完成时触发的依赖函数和操作。标识由async
方法生成的异步任务的标记接口。在完成结果或任务的过程中遇到错误或其他异常时抛出的异常。一种将新异步任务的生成与已完成任务结果的使用分离开来的服务。CompletionStage <T>可能是异步计算的一个阶段,它在另一个 CompletionStage 完成时执行操作或计算值。ConcurrentHashMap <K,V> 一个哈希表,支持检索的完全并发和更新的高预期并发。将 ConcurrentHashMap 视为键的Set
视图,其中可以通过映射到公共值来选择性地启用添加。基于链接节点的无界并发双端队列。基于链接节点的无限线程安全队列。ConcurrentMap <K,V> AMap
提供线程安全和原子性保证。ConcurrentNavigableMap <K,V> ConcurrentMap
支持NavigableMap
操作,并递归地支持其可导航子map。ConcurrentSkipListMap <K,V> 可扩展的并发ConcurrentNavigableMap
实现。基于ConcurrentSkipListMap
的可扩展并发NavigableSet
实现。一个Set
使用内部CopyOnWriteArrayList
进行所有操作。一种同步辅助工具,允许一个或多个线程等待,直到其他线程中执行的一组操作完成。CountedCompleter <T>一个ForkJoinTask
,在触发时执行完成操作,并且没有剩余的待处理操作。允许一组线程全部等待彼此到达公共屏障点的同步辅助工具。一种混合风格的界面,用于标记在给定延迟后应采取行动的对象。DelayQueue <E 扩展 Delayed >一个无限的 阻塞队列 个Delayed
个元素,其中一个元素只有在其延迟到期时才能被获取。Exchanger <V>线程可以配对和交换成对元素的同步点。异常而中止的任务的结果时抛出异常。执行提交的Runnable
任务的对象。使用提供的Executor
执行任务的CompletionService
。Flow.Processor <T,R> 一个既充当订阅者又充当发布者的组件。Flow.Publisher <T>订阅者收到的项目(和相关控制消息)的生产者。Flow.Subscriber <T>消息的接收者。链接Flow.Publisher
和Flow.Subscriber
的消息控制。用于运行ForkJoinTask
的ExecutorService
。用于创建新ForkJoinWorkerThread
的工厂。用于扩展在ForkJoinPool
s 中运行的任务的托管并行性的接口。ForkJoinTask<V>在ForkJoinPool
中运行的任务的抽象基类。由ForkJoinPool
管理的线程,它执行ForkJoinTask
s。Future <V>Future
表示异步计算的结果。表示计算状态。FutureTask <V>可取消的异步计算。基于链接节点的可选边界 阻塞双端队列。基于链接节点的可选边界 阻塞队列。基于链接节点的无界TransferQueue
。一个可重用的同步屏障,在功能上类似于CyclicBarrier
和CountDownLatch
但支持更灵活的使用。一个无界的 阻塞队列,它使用与类PriorityQueue
相同的排序规则并提供阻塞检索操作。递归无结果ForkJoinTask
。递归结果轴承ForkJoinTask
。当无法接受执行任务时,由Executor
抛出异常。ThreadPoolExecutor
无法执行的任务的处理程序。RunnableFuture <V>一个ScheduledFuture
即Runnable
。一个ExecutorService
可以安排命令在给定延迟后运行,或定期执行。可以取消的延迟产生结果的动作。ThreadPoolExecutor
可以额外安排命令在给定延迟后运行,或定期执行。计数信号量。一个Flow.Publisher
向当前订阅者异步发布提交的(非空)项目,直到它关闭。SynchronousQueue <E>A 阻塞队列 其中每个插入操作必须等待另一个线程的相应删除操作,反之亦然。按需创建新线程的对象。随机数生成器(周期为 264) 隔离到当前线程。一个ExecutorService
,它使用可能的几个池线程之一执行每个提交的任务,通常使用Executors
工厂方法配置。抛出RejectedExecutionException
的被拒绝任务的处理程序。被拒绝任务的处理程序直接在execute
方法的调用线程中运行被拒绝的任务,除非执行程序已关闭,在这种情况下任务将被丢弃。被拒绝任务的处理程序会丢弃最早的未处理请求,然后重试execute
,除非执行程序已关闭,在这种情况下任务将被丢弃。被拒绝任务的处理程序,它默默地丢弃被拒绝的任务。阻塞操作超时时抛出异常。TimeUnit
表示给定粒度单位的持续时间,并提供实用方法来跨单位转换,并在这些单位中执行计时和延迟操作。TransferQueue <E>BlockingQueue
,生产者可以在其中等待消费者接收元素。