0

0

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

P粉602998670

P粉602998670

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

|

547人浏览过

|

来源于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免费学习笔记(深入)”;

CG Faces
CG Faces

免费的 AI 人物图像素材网站

下载
  • 容易踩的坑:用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,临界区用synchronizedReentrantLock
  • 容易被忽略:即使用了volatile修饰变量,也不能保证复合操作(如if (flag) doSomething())的原子性
并发真正的难点不在“怎么起线程”,而在“怎么不让它们撞车”。硬件层的并行能力是固定的,但软件层的并发逻辑,得靠你一层层把共享、顺序、可见性这些隐含假设都显式处理清楚。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

790

2023.08.22

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

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

198

2023.11.20

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

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

198

2023.11.20

string转int
string转int

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

564

2023.08.02

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

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

547

2024.08.29

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

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

153

2025.08.29

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

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

204

2025.08.29

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

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

69

2025.10.23

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.5万人学习

Java 教程
Java 教程

共578课时 | 57.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号