Java 多线程演进
Java Multi-threading Evolution
JDK 1.x
- java.lang.Thread
- java.lang.ThreadGroup
- java.lang.Runnable
- java.lang.Process
- java.lang.ThreadDeath
- 和一些异常类
- java.lang.IllegalMonitorStateException
- java.lang.IllegalStateException
- java.lang.IllegalThreadStateException
- 它也有很少的同步集合,例如java.util.Hashtable
JDK 1.5
JDK 1.5 是继 JDK 1.x 之后的第一个大版本;它包含多个并发实用程序。Executor,semaphore,mutex,barrier,latches,concurrent collections和blocking queues; 所有这些都包含在此版本本身中。
- 任务调度框架 Executor 框架是根据一组执行策略对异步任务的调用、调度、执行和控制进行标准化的框架。提供的实现允许任务在提交线程、 单个后台线程、新创建的线程或 线程池中执行,并且开发人员可以创建 支持任意执行策略的 Executor。内置实现提供可配置的策略,例如队列长度限制和 饱和策略 它可以通过防止失控的资源消耗来提高应用程序的稳定性。
- Concurrent Collections - 添加了几个新的 Collections 类,包括新的 Queue 和 BlockingQueue 接口, 以及
Map
List
Queue
接口的高性能并发实现。 - Atomic Variables - 用于原子操作单个变量(原始类型或引用)的类,提供高性能的原子算术和比较和设置方法。与使用同步(在大多数平台上)相比,原子变量实现 java.util.concurrent.atomic 提供了更高的性能,这使得它们可用于实现高性能并发算法以及方便地实现计数器和序列号生成器。
- Synchronizers - 通用同步类,包括 semaphores(信号量), mutexes(互斥体), barriers(屏障), latches(锁存器), and exchangers(交换器) ,它们有助于线程之间的协调。
- 锁 - 虽然锁定是通过 synchronized 关键字内置到 Java 语言中的,但内置监视器锁有许多不方便的限制。该
java.util.concurrent.locks
包提供了一个高性能的锁实现,具有与同步相同的内存语义,但它还支持在尝试获取锁时指定超时、每个锁的多个条件变量、非词法范围的锁,并支持中断线程等待获取锁。 - 纳秒粒度计时 - 该
System.nanoTime
方法允许访问纳秒粒度时间源以进行相对时间测量,并且接受超时的方法(例如BlockingQueue.offer
、BlockingQueue.poll
、Lock.tryLock
、Condition.await
和Thread.sleep
)可以以纳秒为单位获取超时值。的实际精度System.nanoTime
取决于平台。
JDK 1.7
基于 ForkJoinPool
类的 fork/join 框架是 Executor
接口的实现。它旨在使用工作线程池有效地运行大量任务。工作窃取技术用于保持所有工作线程忙碌,以充分利用多个处理器。该目录 <Java home>/sample/forkjoin/
包含演示 fork/join 框架的示例。
类 ThreadLocalRandom
使用伪随机数消除线程之间的争用。
类 Phaser
是一个新的同步屏障,类似于 CyclicBarrier
。
JDK 1.8
JDK 1.8 主要以 Lambda 更改而闻名,但它也很少有并发更改。集合框架在 Java 8 中进行了重大修订,以添加基于新添加的 stream 工具和 lambda 表达式的聚合操作;导致在几乎所有 Collection 类中都添加了大量方法,而且在并发集合中也是如此。
在 java.util.concurrent
包中添加了两个新接口和四个新类:
- Interface
CompletableFuture.AsynchronousCompletionTask
: 标识由异步方法生成的异步任务的标记接口。 - Interface
CompletionStage<T>
: 可能是异步计算的一个阶段,它执行一个动作或在另一个CompletionStage完成时计算一个值。 - Class
CompletableFuture<T>
: Future 可以显式完成(设置其值和状态),并且可以用作 CompletionStage,支持在其完成时触发的依赖函数和动作。 - Class
ConcurrentHashMap.KeySetView<K,V>
:ConcurrentHashMap作为一个Set键的视图,其中可以通过映射到一个公共值来选择性地启用添加。 - Class
CountedCompleter<T>
: ForkJoinTask,触发时执行完成操作,并且没有剩余的待处理操作。 - Class
CompletionException
: 在完成结果或任务的过程中遇到错误或其他异常时抛出的异常。
java.util.concurrent.atomic 中的新类:
维护可能由许多线程更新的单个计数、总和等是一个常见的可伸缩性问题。此版本通过一小组新类 ( DoubleAccumulator, DoubleAdder, LongAccumulator, ) 引入了可扩展的可更新变量支持,这些类在内部采用竞争减少技术,与变量LongAdder相比可提供巨大的吞吐量改进。Atomic这可以通过以大多数应用程序可接受的方式放宽原子性保证来实现。
- DoubleAccumulator:一个或多个变量共同维护使用提供的函数更新的运行双精度值。
- DoubleAdder:一个或多个变量共同保持初始为零的双和。
- LongAccumulator:一个或多个变量共同维护使用提供的函数更新的运行长值。
- LongAdder:一个或多个变量共同保持初始零长总和。