讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里什么是并发与并行_Java并发基础概念说明

雨丽同学_2892

雨丽同学_2892

发布时间:2026-02-04 10:51:00

|

587人浏览过

|

来源于php中文网

原创

并发是程序能同时管理多个任务,即使单核也靠时间片切换实现;并行需多核硬件支持,真正物理同时执行。Java中应优先用ExecutorService线程池而非裸Thread,并注意parallelStream()共享ForkJoinPool的风险。

在java里什么是并发与并行_java并发基础概念说明

并发是“能管多个任务”,并行是“真能同时干”

Java里说的并发(Concurrency),不是指CPU真在同时跑多个线程,而是指程序具备**同时管理多个任务的能力**——哪怕只有一个CPU核心,也能靠快速切换(比如每10ms切一次)让多个任务轮流执行,看起来像在“一起动”。并行(Parallelism)则必须有硬件支撑:多核CPU、或多台机器,让不同线程**物理上同一时刻运行在不同核心上**。

常见错误现象:Thread.sleep(1) 后发现两个线程输出依然交错,就以为“没并发”;其实这恰恰是并发的典型表现——单核下靠调度器切任务,不是bug,是设计使然。

  • 适用场景:I/O密集型任务(如HTTP请求、文件读写)优先用并发,避免CPU空等
  • 适用场景:CPU密集型任务(如图像缩放、数值计算)才值得拆成并行子任务
  • 性能影响:盲目开100个线程做计算,在4核机器上反而因上下文切换拖慢整体速度

Java中怎么写出并发代码?别只new Thread()

最基础的并发实现是启动多个Thread,但实际项目里几乎不用裸写Thread——它难控、易泄漏、不复用。真正该用的是ExecutorService线程池。

例如:Executors.newFixedThreadPool(4) 创建固定4线程池,比手动new Thread().start() 更安全,还能统一管理生命周期。

立即学习“Java免费学习笔记(深入)”;

  • 容易踩的坑:用Executors.newCachedThreadPool()处理不可控的请求量,可能导致OOM(线程数无限增长)
  • 参数差异:corePoolSize决定常驻线程数,maximumPoolSize是峰值上限,两者差值由队列容量和拒绝策略共同约束
  • 兼容性注意:Java 21+ 推荐用StructuredTaskScope替代传统线程池做短生命周期协作任务

并行流parallelStream()不是银弹

list.parallelStream().map(...).filter(...).collect(...) 看似一行搞定并行,但它底层依赖ForkJoinPool.commonPool(),而这个公共池是全JVM共享的——如果某段代码耗尽了它的线程,其他模块(比如CompletableFuture默认也用它)就会卡住。

  • 使用场景:数据量大(>10万元素)、操作无状态且无IO(比如纯数学变换)时收益明显
  • 危险操作:在parallelStream()里调用System.out.println()或写数据库,可能引发竞态或连接池枯竭
  • 替代方案:明确指定自定义ForkJoinPool,或改用CompletableFuture.supplyAsync(..., executor)控制线程来源

并发 ≠ 线程安全,别把Runnable当护身符

很多人以为“用了多线程就是并发编程”,结果共享变量出问题:两个线程同时对int count = 0执行count++,最后不是2而是1——因为count++不是原子操作(读-改-写三步)。

关键点在于:并发只是让多个任务“能一起跑”,但**共享资源的访问控制要另外加锁或用原子类**。

  • 常见错误:用ArrayList存并发产生的日志,没加锁也没换CopyOnWriteArrayList,导致ConcurrentModificationException
  • 正确姿势:计数用AtomicInteger,集合用ConcurrentHashMap,临界区用synchronized或ReentrantLock
  • 容易被忽略:即使用了volatile修饰变量,也不能保证复合操作(如if (flag) doSomething())的原子性
并发真正的难点不在“怎么起线程”,而在“怎么不让它们撞车”。硬件层的并行能力是固定的,但软件层的并发逻辑,得靠你一层层把共享、顺序、可见性这些隐含假设都显式处理清楚。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3248

2023.11.20

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3248

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6499

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3145

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4068

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2805

2025.08.29

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

774

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4278

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn