Java并发编程从入门到实战:同步、异步、多线程核心原理全解析
《Java并发编程从入门到实战:同步、异步、多线程核心原理全解析》
一、多线程基础认知(从单核到多核的进化)
1.1 什么是线程?
线程是程序执行的最小单元,一个进程可以包含多个线程。例如浏览器同时下载文件(后台线程)和渲染页面(UI线程)。
1.2 创建线程的三种方式
// 方式1:继承Thread类
class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程执行: " + Thread.currentThread().getName());}
}
new MyThread().start();// 方式2:实现Runnable接口(推荐)
Runnable task = () -> {System.out.println("Runnable线程: " + Thread.currentThread().getName());
};
new Thread(task).start();// 方式3:使用线程池(生产环境首选)
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> {System.out.println("线程池任务: " + Thread.currentThread().getName());
});
executor.shutdown();
1.3 线程生命周期图解
graph TDA[新建] -->|start()| B[就绪]B -->|获取CPU| C[运行]C -->|yield()/时间片用完| BC -->|sleep()/wait()/IO阻塞| D[阻塞]D -->|唤醒/IO完成| BC -->|run()结束| E[终止]
二、同步机制:守护数据安全的金钥匙
2.1 同步问题经典案例
class BankAccount {private int balance = 1000; // 初始余额1000元// 未同步的取款方法(危险!)public void withdraw(int amount) {if (balance >= amount) {try {Thread.sleep(100); // 模拟处理延迟} catch (InterruptedException e) {e.printStackTrace();}balance -= amount;}}public int getBalance() { return balance; }
}public static void main(String[] args) throws InterruptedException {BankAccount account = new BankAccount();// 两个线程同时取款Thread t1 = new Thread(() -> account.withdraw(800));Thread t2 = new Thread(() -> account.withdraw(800));t1.start();t2.start();t1.join();t2.join();System.out.println("最终余额: " + account.getBalance()); // 可能输出-600(实际应为正数)
}
2.2 同步解决方案
// 方案1:synchronized方法
public synchronized void withdraw(int amount) { /* 同上 */ }// 方案2:synchronized代码块
public void withdraw(int amount) {synchronized(this) {if (balance >= amount) {// 业务逻辑}}
}// 方案3:使用ReentrantLock
private Lock lock = new ReentrantLock();
public void withdraw(int amount) {lock.lock();try {if (balance >= amount) {// 业务逻辑}} finally {lock.unlock(); // 必须手动释放锁}
}
2.3 同步工具类实战
CountDownLatch(倒计时门闩)
// 模拟3个玩家加载完成后开始游戏
CountDownLatch latch = new CountDownLatch(3);List<Thread> players = Arrays.asList(new Thread(() -> {System.out.println("玩家1加载完成");latch.countDown();}),// 其他玩家线程...
);players.forEach(Thread::start);
latch.await(); // 主线程阻塞等待
System.out.println("所有玩家就绪,游戏开始!");
CyclicBarrier(循环屏障)
// 3个线程到达屏障后执行统一动作
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程到达屏障,继续执行"));IntStream.range(0,3).forEach(i -> new Thread(() -> {try {System.out.println("线程"+i+"到达屏障");barrier.await();} catch (Exception e) {e.printStackTrace();}
}).start());
三、异步编程:让程序飞起来
3.1 异步回调模式
CompletableFuture.supplyAsync(() -> {// 模拟长时间计算try { Thread.sleep(2000); } catch (Exception e) {}return "计算结果";
}).thenAccept(result -> {System.out.println("获取到结果: " + result);
});System.out.println("主线程继续执行其他任务...");
3.2 异步任务组合
CompletableFuture<String> queryUser = CompletableFuture.supplyAsync(() -> "用户数据");
CompletableFuture<String> queryOrder = CompletableFuture.supplyAsync(() -> "订单数据");queryUser.thenCombine(queryOrder, (user, order) -> {return "合并结果: " + user + " + " + order;
}).thenAccept(System.out::println);
3.3 异步异常处理
CompletableFuture.supplyAsync(() -> {if (new Random().nextBoolean()) {throw new RuntimeException("模拟异常");}return "成功结果";
}).exceptionally(ex -> {System.out.println("捕获异常: " + ex.getMessage());return "默认值";
}).thenAccept(System.out::println);
四、并发编程实战技巧
4.1 线程池最佳实践
ThreadPoolExecutor executor = new ThreadPoolExecutor(4, // 核心线程数8, // 最大线程数60, TimeUnit.SECONDS, // 空闲线程存活时间new LinkedBlockingQueue<>(100), // 任务队列new ThreadFactory() { // 自定义线程工厂private AtomicInteger count = new AtomicInteger(1);public Thread newThread(Runnable r) {return new Thread(r, "业务线程-" + count.getAndIncrement());}},new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);// 提交任务
Future<Integer> future = executor.submit(() -> {return 1 + 1;
});// 获取结果
try {System.out.println(future.get(1, TimeUnit.SECONDS));
} catch (TimeoutException e) {System.out.println("任务超时");
}
4.2 原子操作类
AtomicInteger counter = new AtomicInteger(0);IntStream.range(0,100).forEach(i -> new Thread(() -> {counter.incrementAndGet(); // 原子自增
}).start());System.out.println("最终计数: " + counter.get()); // 保证输出100
4.3 ThreadLocal原理
class UserContextHolder {private static ThreadLocal<User> holder = new ThreadLocal<>();public static void set(User user) {holder.set(user);}public static User get() {return holder.get();}
}// 在Web请求中设置用户信息
UserContextHolder.set(currentUser);
// 在任何地方获取当前线程用户
User user = UserContextHolder.get();
五、综合应用:电商库存扣减案例
class InventoryService {private AtomicInteger stock = new AtomicInteger(100);public boolean deductStock(int quantity) {while (true) {int current = stock.get();if (current < quantity) {return false;}if (stock.compareAndSet(current, current - quantity)) {return true; // CAS成功}// CAS失败重试}}
}// 模拟100个并发请求
ExecutorService executor = Executors.newCachedThreadPool();
InventoryService service = new InventoryService();IntStream.range(0,100).forEach(i -> executor.submit(() -> {if (service.deductStock(1)) {System.out.println(Thread.currentThread().getName() + " 扣减成功");} else {System.out.println("库存不足");}
}));executor.shutdown();
总结与进阶建议
学习路线图:
- 掌握Java内存模型(JMM)与happens-before原则
- 深入理解synchronized锁升级机制(偏向锁->轻量级锁->重量级锁)
- 研究AQS(AbstractQueuedSynchronizer)底层原理
- 学习分布式环境下的并发控制(Redis分布式锁、ZooKeeper选主)
推荐工具:
- VisualVM:监控线程状态与锁竞争
- JMH:编写并发性能测试
- Arthas:在线诊断生产环境并发问题
注意事项:
- 避免过度使用synchronized(可能引发死锁)
- 线程池参数需根据业务特点调整(CPU密集型 vs IO密集型)
- 异步回调中必须处理异常(防止静默失败)
- 使用ThreadLocal后及时remove(防止内存泄漏)
掌握这些知识后,您已经具备处理Java并发编程的基本能力。接下来可以通过《Java并发编程实战》等经典书籍继续深造,同时多参与高并发开源项目(如Netty、RocketMQ)的源码研究,逐步成长为并发编程高手。
相关文章:
Java并发编程从入门到实战:同步、异步、多线程核心原理全解析
《Java并发编程从入门到实战:同步、异步、多线程核心原理全解析》 一、多线程基础认知(从单核到多核的进化) 1.1 什么是线程? 线程是程序执行的最小单元,一个进程可以包含多个线程。例如浏览器同时下载文件࿰…...
《引流获客》总结
第一章 入门篇 理解爆款打法和引流打法的区别 爆款打法:刷播放量,制作“爆款”视频/文案。 引流打法:刷有效转化,不在意播放量,而注重有多少观众被引流成为客户,完成消费,即成交转化。 定理&…...
基于Python的机器学习入门指南
在当今数字化时代,机器学习(Machine Learning)已经成为科技领域中最热门的话题之一。它不仅改变了我们对数据的理解和处理方式,还在许多行业中得到了广泛应用,如金融、医疗、交通等。Python作为一门强大的编程语言&…...
【蓝桥杯每日一题】3.25
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x “OJ超时不是终点,是算法在提醒你该优化时间复杂度了!” 目录 3.25 差分数组 一、一维差分 题目链接: 题目描述: 解题思路:…...
Kubernetes高级应用之-重启策略
一、介绍+扩展应用(涉及的高级资源在后续会写出来) # Kubernetes Pod重启策略(RestartPolicy)全面解析 ## 一、重启策略的核心价值与重要性 在Kubernetes集群中,Pod重启策略(RestartPolicy&a…...
Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)
文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…...
Next.js 严重漏洞:攻击者可绕过中间件授权检查
Next.js React 框架近日披露了一个严重的安全漏洞,攻击者可在特定条件下利用该漏洞绕过授权检查。该漏洞被标记为 CVE-2025-29927,其 CVSS 评分为 9.1(满分 10.0)。 漏洞详情 Next.js 在公告中表示:“Next.js 使用内…...
气象可视化卫星云图的方式:方法与架构详解
气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…...
NLP高频面试题(十四)——DPO、PPO等强化学习训练方法介绍
强化学习(Reinforcement Learning,RL)近年来随着深度学习的快速发展而备受关注,特别是在游戏控制、自动驾驶、机器人控制及大语言模型训练等领域均有广泛应用。本文将重点介绍强化学习中的经典训练方法,包括PPO&#x…...
从 Neo4j 数据库中提取数据并绘制图谱
代码说明: 连接 Neo4j 数据库: 使用 py2neo.Graph 连接到 Neo4j 数据库。确保替换 uri、username 和 password 为你的实际配置。 Cypher 查询: 查询数据库中的节点和关系,限制返回的记录数(例如 LIMIT 100)…...
Android Compose 框架隐式动画之过渡动画深入剖析(二十六)
Android Compose 框架隐式动画之过渡动画深入剖析 一、引言 在移动应用开发领域,用户体验始终是至关重要的。动画效果作为提升用户体验的关键元素,能够为应用增添生动性和交互性。Android Compose 作为现代 Android UI 工具包,为开发者提供…...
esp32s3聊天机器人(三)
先放上最新的硬件图 添加了按钮、600毫安锂电池和充电板 关于 sherpa-onnx 语音生成的打断 按说明实现了一下,但是偶尔还是有问题,毕竟不是直接立刻打断生成 private int OnAudioData(nint samples, int n){//Console.WriteLine("OnAudioData n…...
超融合服务器是什么
超融合服务器的定义与背景 超融合服务器(Hyperconverged Infrastructure, HCI)是一种通过软件定义技术,将计算、存储、网络和虚拟化功能整合到单一硬件平台中的IT基础设施解决方案。其核心目标是通过资源的高度集成和统一管理,简…...
Rust从入门到精通之精通篇:22.Unsafe Rust 详解
Unsafe Rust 详解 在 Rust 的设计哲学中,安全性是核心原则之一。Rust 的所有权系统、借用检查器和类型系统共同保证了内存安全和线程安全。然而,有些底层操作无法通过 Rust 的安全检查机制进行验证,这就是 unsafe Rust 存在的原因。在本章中,我们将深入探讨 unsafe Rust,…...
如何设计系统扩展性以应对业务增长
要设计具备良好扩展性的系统以应对业务增长,关键在于采用分布式架构、实现服务的松耦合、保证数据库的水平扩展能力、使用缓存和CDN优化性能、做好持续监控与自动化运维。其中,服务的松耦合尤为重要。松耦合意味着系统中各服务之间的依赖关系较弱&#x…...
Python基于Django的小区监控图像拼接系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
ElasticSearch快速入门--实现分词搜索
分词题目搜索 使用Elasticsearch实现题目数据的存储和分词搜索,需要将数据库的数据同步到 Elasticsearch。 ElasticSearch入门 ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,用Java开发并且是当前最流行的开源的…...
解读探寻数字影像新路径:树莓集团现状最新进展
树莓集团在数字影像领域展现出强劲的发展势头,其核心战略在于构建完整的数字产业生态链。 产业园建设与运营 全国布局: 树莓集团已在全国范围内建设并运营多个国际数字影像产业园,旨在打造区域性的数字产业高地。 成都案例: 在成…...
数据治理之数据仓库
本文主要阐述了数据仓库在大数据平台项目中的地位和重要性,对目前市场上数据仓库主流设计进行分析说明,讲述了通用数据仓库设计上所应考虑的因素。 数据仓库介绍 数据仓库是一个过程而不是一个项目;数据仓库是一个环境,而不是一件产品。数据仓库提供用户用于决策支持的当前…...
自由学习记录(48)
When the material of an object disappears, the light and shadow also disappear (synchronized) Tiling And Offset 显示的是四分之一前面的,不是中间的四分之一块, 准确的还是跟着视频学, ,AI一些回答会散发一种“奇怪的错味…...
zynq7020 最小ps环境速通
1 简介 环境: 硬件 野火 zynq 皓月 xc7z020clg400-1 软件: vivado2020.2 vitis2020.2 petalinux2020.2 搭建 ps 的最小环境,跑裸机 helloworld 测试 uart 和 ddr,跑 linux 系统. 2 ps 环境搭建 2.1 uart 2.1 ddr 2.1 删除 pl 接口,包括 pl 时钟,pl 时钟复位,axi_m. 具体略…...
Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现
文章目录 Modbus RTU到Modbus TCP透传技术实现1. 透传技术概述1.1 透传基本原理- 协议帧格式转换- 地址映射与管理- 通信时序适配- 错误检测与处理 2. 透传网关硬件架构2.1 典型硬件结构- 微控制器/处理器(ARM、STM32等)- RS-485/RS-232收发器- 以太网控制器(如W5500)- 电源管理…...
【SOC 芯片设计 DFT 学习专栏 -- IDDQ 测试 与 Burn-In 测试】
文章目录 IDDQ 测试与 Burn-In 测试IDDQ 测试工作原理测试过程优点局限性示例 2. Burn-In 测试工作原理测试过程优点局限性示例 总结对比 IDDQ 测试和 Burn-in 测试: IDDQ 测试与 Burn-In 测试 本文将详细介绍 DFT 中 IDDQ测试 和 burn-in测试模式 IDDQ 测试 IDD…...
Rust从入门到精通之进阶篇:19.Rust 生态系统
Rust 生态系统 Rust 拥有一个丰富而活跃的生态系统,提供了各种库和框架来支持不同领域的开发。在本章中,我们将探索 Rust 生态系统中的主要组件,了解常用的库和工具,以及如何在项目中有效地使用它们。 Rust 包管理:Cargo 和 crates.io Cargo 回顾 Cargo 是 Rust 的构建…...
【HarmonyOS Next】三天撸一个BLE调试精灵
【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP,在用户使用的过程中,负责调试BLE设备从机端,比如蓝牙耳机、低功耗设备、带有BLE的空调等设备,可以在页面中清晰看到设备的厂商,…...
STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]
一、项目概述 本文基于 STM32F103C8T6 单片机,设计了一个高精度温度控制系统。通过 DS18B20 采集温度,采用位置型 PID 算法控制 PWM 输出驱动 MOS 管加热Pi膜,配合 OLED 实时显示温度数据。系统可稳定将 PI 膜加热至 40℃,适用于…...
【docker】docker-compose安装RabbitMQ
docker-compose安装RabbitMQ 1、配置docker-compose.yml文件(docker容器里面的目录请勿修改)2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件(docker容器里面的目录请勿修改) versi…...
如何突破MacBook苹果电脑Cursor限制:免费版的解决方法
Macbook苹果电脑无限白嫖Cursor|解决免费版限制问题|达到50次150次续杯|arm|intel 如何突破MacBook苹果电脑Cursor限制:免费版的解决方法 前言 本文介绍了如何在MacBook上突破Cursor免费版的使用限制。请遵循以下步骤进行操作。 操作步骤 进入程序目录:…...
网络原理之传输层
前文我们了解 应用层 传输层 网络层 数据链路层 物理层 这五层结构,此文我先讨论传输层相关的知识 1. 传输层 负责数据能够从发送端传输到接收端. 1.1 端口号 端⼝号(Port)标识了⼀个主机上进行通信的不同的应用程序 端口号范围划分: 0-1023:知名端口号,HTTP,FTP,SSH等这些…...
一个免费 好用的pdf在线处理工具
pdf24 doc2x 相比上面能更好的支持数学公式。但是收费...
新书速览|云原生Kubernetes自动化运维实践
《云原生Kubernetes自动化运维实践》 本书内容: 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础,全面系统地阐述Kubernetes(K8s)在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…...
解决安卓so库异常无法打印堆栈的问题
解决方案: 设置 android:extractNativeLibs"true" 直接在 AndroidManifest.xml 里加上: <applicationandroid:extractNativeLibs"true"> </application>这样,so 文件会被解压,崩溃时可以正常打…...
996引擎-接口测试:背包
996引擎-接口测试:背包 背包测试NPC参考资料背包测试NPC CONSTANT = require("Envir/QuestDiary/constant/CONSTANT.lua"); MsgUtil = require("Envir/QuestDiary/utils/996/MsgUtil.lua");...
红数码影视(RED Digital Cinema)存储卡格式化后的恢复方法
红数码影视(RED Digital Cinema)的摄像机可以生成两种RAW级高清视频文件,一种是R3D,一种是MOV。其中MOV属于苹果(apple)公司的QT视频封装结构,使用的视频编码是Apple ProRes;而R3D则是RED公司自创的RAW视频文件,这种文件解码需要使…...
若依前端框架增删改查
1.下拉列表根据数据库加载 这个是用来查询框 绑定了 change 事件来处理站点选择变化后的查询逻辑。 <el-form-item label"站点选择" prop"stationId" v-has-permi"[ch:m:y]"><el-select v-model"queryParams.stationId" pl…...
YARN Cluster模式和Client模式的区别是什么
在 Apache Spark 的 YARN 部署中,Cluster 模式和Client 模式的核心区别在于 Driver 的启动位置和客户端(提交任务的机器)的角色。以下是两者的详细对比: 1. 核心区别概览 特性YARN Cluster 模式YARN Client 模式Driver 位置在 YA…...
哪吒汽车:一边熬夜蹦迪,一边找药投医
两年前,威马CEO沈晖发了个短视频,内容是“活下去,像牲口一样活下去”。 如今最能体会沈晖当时心情的,估计就是方运舟了。 作为哪吒汽车创始人兼董事长,他连续多次被限高,为了让哪吒汽车活下去,…...
Java 集合 List、Set、Map 区别与应用
一、核心特性对比 二、底层实现与典型差异 List ArrayList:动态数组结构,随机访问快(O(1)),中间插入/删除效率低(O(n))LinkedList:双向链表结构,头尾操作…...
天地图InfoWindow插入React自定义组件
截至2025年03月21日天地图的Marker不支持添加Label; 同时Label和Icon是不支持自定义HTMLElement只支持String;目前只有InfoWindow支持自定义HTMLElement; 效果图 React核心api import ReactDOM from react-dom/client const content document.createElement(div);…...
深度学习PyTorch之动态计算图可视化 - 使用 torchviz 生成计算图
序号系列文章1深度学习训练中GPU内存管理2深度学习PyTorch之数据加载DataLoader3深度学习 PyTorch 中 18 种数据增强策略与实现4深度学习pytorch之简单方法自定义9类卷积即插即用5深度学习PyTorch之13种模型精度评估公式及调用方法6深度学习pytorch之4种归一化方法(…...
拓展知识三:编码学及密码学
编码和密码的区别 研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。 编码和密码是两个不同的概念,它们的区别如下:…...
【商城实战(54)】解锁商城国际化密码:内容管理全攻略
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测
# 打包器 -WebPack- 使用 & 安全 参考: https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源文件都作为模块处理。 它将根据模块的依赖关系进行分析,生成对应的资源。 五个核心概…...
【嵌入式硬件】三款DCDC调试笔记
关于开关电源芯片,重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例,输入电压范围4-36V,输出最大电流3A,最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况: 6V带2A…...
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析 引言1. 什么是 Web Workers?Web Workers 的特点: 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1:创建 Worker 文件步骤 2:在主线程中调用 Worker 3…...
计算机网络的分类——按照按拓扑结构分类
计算机的拓扑结构是引用拓扑学中研究和大小、形状无关的点、线关系的方法,将网络中的计算机和通信设备抽象为一个点,把传输介质抽象成一条线,由点和线组成的几何图形就是计算机网络的拓扑结构。计算机网络的拓扑结构主要由通信子网决定&#…...
AI大白话(四):自然语言处理——AI是如何理解和生成人类语言的?
🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? AI大白话(三):深度学习——AI的‘大脑‘是如何构建的? 大家好!欢迎回到"AI大白话"系列。前面我们聊了AI的基本概念、机器学习的原理…...
Android第六次面试总结(Java设计模式篇一)
单例模式属于创建型设计模式,它保证一个类仅有一个实例,并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。 好处 资源优化:单例模式能保证一个类只有一个实例,这对于那些创建和销毁开销大的对象&…...
如何在 React 项目中进行服务器端渲染(SSR),它有什么优势
大白话如何在 React 项目中进行服务器端渲染(SSR),它有什么优势 什么是服务器端渲染(SSR) 在传统的 React 项目里,页面的渲染工作是在浏览器里完成的。也就是当你访问一个网页时,浏览器会先下…...
JVM 01
今天是2025/03/20 16:36 day 09 总路线请移步主页Java大纲相关文章 今天进行JVM前二个模块的归纳 首先是JVM的相关内容概括的思维导图 以下是针对思维导图中 内存管理 和 垃圾回收(GC) 模块的详细说明: 1. 内存管理(运行时数据…...