如何理解Java中的并发?

news/2025/10/28 10:54:02/文章来源:https://www.cnblogs.com/htmlww/p/19171203

Java 中的并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等)。

一、为什么需要并发?

  1. 资源利用率最大化
    当程序执行 I/O 操作(如读写文件、网络请求)时,CPU 通常处于空闲状态。通过并发,可在等待 I/O 时让 CPU 处理其他任务,避免资源浪费。
    例如:一个下载文件的程序,在等待网络数据时,可同时解析已下载的部分数据。

  2. 响应速度提升
    对于交互式程序(如 GUI 应用、服务器),并发能避免单任务阻塞导致的界面卡顿或请求超时。
    例如:Web 服务器同时处理多个用户的请求,而非逐个排队处理。

二、并发的核心概念

1. 线程(Thread)与进程(Process)

  • 进程:程序的一次执行过程,是系统资源分配的基本单位(有独立的内存空间)。
  • 线程:进程内的执行单元,是 CPU 调度的基本单位(共享进程的内存空间)。
  • 关系:一个进程可包含多个线程(多线程),线程间切换成本远低于进程切换。

2. 并行(Parallelism)与并发(Concurrency)的区别

  • 并发:多个任务“交替执行”(CPU 切换速度快,看起来同时进行),适用于单 CPU 或多 CPU。
  • 并行:多个任务“同时执行”(需多 CPU 核心,每个核心处理一个任务)。
    例如:4 核 CPU 同时运行 4 个线程是并行,1 核 CPU 快速切换 4 个线程是并发。

三、Java 实现并发的方式

Java 提供了多种并发编程工具,核心是通过线程实现:

1. 基础方式

  • 继承 Thread 类:重写 run() 方法定义任务,调用 start() 启动线程。
  • 实现 Runnable 接口:定义任务逻辑,通过 Thread 类包装并启动(推荐,避免单继承限制)。
  • 实现 Callable 接口:与 Runnable 类似,但可返回结果并抛出异常,配合 Future 获取结果。

    // Callable 示例
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;public class CallableDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {// 1. 定义任务(有返回值)Callable<Integer> task = () -> {int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;};// 2. 包装任务FutureTask<Integer> futureTask = new FutureTask<>(task);// 3. 启动线程new Thread(futureTask).start();// 4. 获取结果(会阻塞直到任务完成)System.out.println("1-100的和:" + futureTask.get()); // 输出5050}
    }
     
     

2. 线程池(ThreadPoolExecutor)

频繁创建/销毁线程会消耗资源,线程池通过复用线程提高效率,是生产环境的首选。
Java 提供 Executors 工具类快速创建线程池:

  import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadPoolDemo {public static void main(String[] args) {// 创建固定大小的线程池(3个线程)ExecutorService pool = Executors.newFixedThreadPool(3);// 提交5个任务(线程池会复用3个线程处理)for (int i = 0; i < 5; i++) {int taskId = i;pool.submit(() -> {System.out.println("处理任务" + taskId + ",线程:" + Thread.currentThread().getName());});}// 关闭线程池pool.shutdown();}}
 
 

四、并发带来的问题及解决方案

并发虽提高效率,但多线程共享资源时会引发问题:

1. 线程安全问题

当多个线程同时操作共享数据(如全局变量、集合),可能导致数据不一致。
示例:两个线程同时对变量 count 做 ++ 操作,预期结果为 2,实际可能为 1(因 ++ 是多步操作,可能被打断)。

2. 解决方案

  • synchronized 关键字:通过“锁”保证同一时间只有一个线程执行临界区代码(修饰方法或代码块)。

    public class SynchronizedDemo {private static int count = 0;private static final Object lock = new Object(); // 锁对象public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {synchronized (lock) {// 同步代码块:同一时间只有一个线程进入count++;}}});Thread t2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {synchronized (lock) {count++;}}});t1.start();t2.start();t1.join(); // 等待线程执行完毕t2.join();System.out.println("count最终值:" + count); // 正确输出20000}
    }
     
     
  • java.util.concurrent 工具类:提供线程安全的集合(如 ConcurrentHashMap)、原子类(如 AtomicInteger)、锁机制(如 ReentrantLock)等,比 synchronized 更灵活。

五、并发编程的核心挑战

  1. 可见性:一个线程修改的共享变量,其他线程可能无法立即看到(因 CPU 缓存导致)。
    解决方案:使用 volatile 关键字(保证变量修改后立即刷新到主内存)。

  2. 原子性:一个操作不可被中断(如 count++ 实际是“读-改-写”三步,非原子操作)。
    解决方案:synchronized、原子类(AtomicInteger)。

  3. 有序性:CPU 可能对指令重排序优化,导致代码执行顺序与预期不一致。
    解决方案:volatilesynchronized 或显式内存屏障。

六、总结

  • 并发的本质:通过多线程交替执行,提高资源利用率和程序响应速度。
  • 核心问题:线程安全(数据不一致),需通过锁机制或并发工具解决。
  • 实践建议:优先使用线程池管理线程,避免手动创建;复杂场景下借助 java.util.concurrent 包的工具类(如 CountDownLatchSemaphore)简化开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch基本指令

ElasticSearch基本指令https://www.elastic.co/cn/ 在postman中,向ES服务器发put请求(增加索引): http://127.0.0.1:9200/shopping 在postman中,向ES服务器发get请求(查询索引): http://127.0.0.1:9200/shopping 在…

2025年无糖无汽苏打水厂家权威推荐榜单:无汽苏打水/pH值高的苏打水/白桃苏打水源头厂家精选

随着健康饮食理念的普及,无糖无汽苏打水市场正以每年超过20%的速度增长,成为饮料行业中备受关注的细分品类。 根据中国饮料工业协会最新数据显示,2024年无糖无汽苏打水市场规模已达85亿元,预计2025年将突破百亿大关…

BOS中设置实际精度为6位小数,前端显示1位小数

注意:配置掩码仅对H5端生效,需要配置“显示格式化字符串”,客户端才有显示1位小数效果。

ctfshow—web ssti 361-372

ctfshow_web-ssti (361~372) web 361 首先,题目提示,名字就是考点,所以应该是需要我们传一个name的参数 然后就是检查是什么模板 然后找到可以注入的模块,这里我找到的是os._wrap_close在132,找模块的数字我们可…

2025年克拉玛依旅游团综合实力TOP3排行榜:阿勒泰旅游/新疆喀纳斯旅游/新疆旅游服务商精选。

据新疆文旅厅数据统计,2024年新疆接待游客总量突破2.5亿人次,同比增长超过30%,其中定制化旅游服务需求增幅显著提升。 本文将根据企业资质、服务质量、资源整合能力及客户满意度等多维度数据,从多家旅行社中筛选出…

2025年塑料合金板材厂家权威推荐榜单:ABS吸塑板/真空吸塑板/ABS吸塑板源头厂家精选

在当今工业制造领域,塑料合金板材凭借其优异的综合性能,已成为汽车、电子、家电等行业的关键材料。根据最新行业研究报告显示,全球高性能塑料板材市场呈现持续增长态势,年复合增长率预计将保持在4.7%-8.9% 。在这一…

2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯企业权威测评指南

引言 随着智慧城市建设与乡村振兴战略的深入推进,路灯行业对产品节能性、智能化与场景适配性的要求显著提升。为帮助采购方精准筛选优质厂商,中国照明电器协会联合西北市政工程设计研究院,对西安及周边区域路灯企业…

php rce的一些绕过

1.通配符?*绕过** 通配符是一种特殊语句,主要有问号(?)和星号(*),用来模糊搜索文件。?:在linux里面可以进行代替字母。?仅代表单个字符串,但此单字必须存在。 *:在linux里面可以进行模糊匹配。*可以代表任何字符…

2025 年污水离心泵,耐腐蚀离心泵,杂质离心泵,卧式离心泵厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读

引言 在工业流体输送领域,污水离心泵、耐腐蚀离心泵、杂质离心泵、卧式离心泵作为关键设备,其性能直接关系到生产效率与环保达标。为精准筛选优质厂家,本次推荐榜单由通用机械工业协会泵业分会指导测评,结合 12 项…

2025 年中压离心泵,高压离心泵,清水离心泵,立式离心泵厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读

引言 在工业流体输送领域,中压离心泵、高压离心泵、清水离心泵及立式离心泵作为关键设备,其性能与可靠性直接关系到生产效率与安全。为精准筛选优质厂家,2025 年度测评工作由通用机械工业协会泵业分会主导,联合多家…

ansible palybook

ansible palybookAnsible # ansible 简介 Ansible是一种常用的自动运维化工具,基于python开发,分布式,无需客户端,轻量级,配置语言采用YAML # Ansible 特点1.模块化:调用特定的模块,完成特殊的任务2.Paramiko(p…

2025信创浪潮下,ITSM 平台选型指南:国产方案如何选对 “运维服务引擎”

2025年信创关键期,国产ITSM从合规适配升级为价值赋能。文章对比主流ITSM产品的核心定位、能力及适用场景,从企业规模、核心需求、长期成本给出选型建议,助力企业选适配的ITSM平台。01. 国产化 ITSM 进入 “价值竞争…

MonoDevelop 的续集dotdevelop

https://www.cnblogs.com/shanyou/p/18415351DotDevelop 是一个跨平台的 .NET 集成开发环境(IDE),它原本是 MonoDevelop 的分支项目,这个项目更侧重于 Linux 支持和 GTK3 升级,github:https://github.com/dotdev…

time-ode项目结构

在Java中,ResponseEntity<PageInfo> 这样的命名和类型组合是一个典型的、遵循良好实践的Web API返回类型,常见于使用Spring框架(如Spring Boot)开发的后端服务中。下面我们来逐层解析其含义和命名的用意:Re…

Lombok 常用注解

分类 注解 作用‌ 常用参数/示例‌核心类注解‌ @Getter/@Setter 自动生成字段的 getter/setter 方法 @Setter(AccessLevel.PROTECTED) 指定访问权限@ToString 生成 toString() @ToString(exclude = "id")…

2025 年长沙美食餐厅最新推荐榜,食材溯源与管理创新双维度下的品质品牌解析

引言 长沙餐饮市场年均新增商户超 1.2 万家,但食品安全抽检不合格率仍达 3.1%,同质化与管理缺失成为行业痛点。为筛选品质标杆,湖南省餐饮行业协会联合黑珍珠评审委员会开展专项测评,覆盖 326 家候选餐厅,采用 “…

2025年新疆电线电缆厂家综合实力TOP3排行榜:耐火电缆/矿用电缆/高温电缆源头厂家精选。

在"一带一路"倡议深入推进与新能源产业快速发展的背景下,新疆电线电缆市场需求呈现多元化、高性能化趋势,品质可靠的本地厂家成为采购首选。 本文将根据技术实力、生产能力、产品质量及市场服务等多维度数…

2025年PPH管材厂家权威推荐榜单:抗冲击性管材/低导热性管材/环保性管材源头厂家精选

在工业流体输送、环保水处理及化工防腐等领域,PPH(均聚聚丙烯)管材凭借其卓越的耐腐蚀性、抗冲击性能及环保特性,已成为不可或缺的关键材料。随着市场需求持续增长,2024年PPH管材全球消费量预计将达到数百万吨级别…

利用STM32驱动nanoPAN5375测距模块进行距离测量

利用STM32驱动nanoPAN5375测距模块进行距离测量,并返回精确的距离信息 了解一下nanoPAN5375模块: nanoPAN5375模块特性特性 描述工作频段 2.4 GHz ISM 免授权频段调制技术 线性调频扩频 (CSS)可编程输出功率 -18 dBm…

2025年高速离心喷雾干燥机厂家权威推荐榜单:离心喷雾干燥机/压力喷雾干燥机/闭路喷雾干燥机源头厂家精选

高速离心喷雾干燥机蒸发能力可达2000kg/h,物料停留时间仅10-30秒,这三家企业以创新技术引领干燥行业革新。 高速离心喷雾干燥技术作为现代粉体处理的核心工艺,以其高效干燥、粒度均匀和热敏性物料适应性强的特点,成…