Parallel与Concurrency辨析:为何Java多任务处理包命名为java.util.concurrency
为什么Java多任务工具包命名为
java.util.concurrent而非并行相关名称 首先需要先澄清一个常见的概念误区:你之前了解的「并发是单核心时间分片、并行是多核同时执行」是比较狭义的简化定义,行业内更通用的界定是:
- 并发(Concurrency)是任务调度层面的属性:指系统支持处理多个生命周期重叠的任务,核心要解决的是多任务之间的调度、同步、资源冲突规避等问题,底层既可以用单核心时间分片实现,也可以用多核同时执行实现
- 并行(Parallelism)是硬件执行层面的属性:指多个任务在同一物理时刻,同时运行在不同的CPU核心上,本质是并发的其中一种实现手段
java.util.concurrent包之所以用concurrency命名,核心是它的定位是覆盖全场景的通用并发基础能力,而不是只提供多核并行能力:
- 这个包包含的线程池、锁、原子类、并发容器、同步工具(
CountDownLatch/CyclicBarrier等),本身不绑定硬件环境,不管是单核心还是多核心CPU都可以使用。哪怕你在单核心设备上用线程池做异步任务调度、用ConcurrentHashMap做多线程安全的资源读写,都是合理的使用场景 - 多核并行只是这个包的能力子集:比如
ExecutorService在多核CPU上会自动将任务分配到不同核心实现并行执行,但这只是它的能力之一,不是全部
Java里专门标注并行的能力都是特定场景的衍生实现,比如Java 8之后的parallelStream()并行流,它的底层任务调度就是依赖java.util.concurrent包下的ForkJoinPool实现的,刚好可以印证concurrency包是更底层的通用基础能力包。
内容的提问来源于stack exchange,提问作者cinqS
相关产品推荐
相关产品推荐

