一周拿捏线程
本周总目标1. 掌握 Java 线程基础创建、启动、生命周期、常用方法2. 理解 synchronized 同步机制解决线程安全问题3. 入门线程池Executors / ThreadPoolExecutor 基本使用4. 学会 volatile 基本作用5. 完成一个多线程安全售票/学生信息录入小案例6. 代码规范周一线程基础 两种创建方式核心知识点1h程序、进程、线程区别线程生命周期新建 → 就绪 → 运行 → 阻塞 → 死亡两种创建方式1. 继承 Thread2. 实现 Runnable- start() 与 run() 区别- 常用方法getName/setName、sleep、yield、join代码实操1.5h1. 写一个类继承 Thread打印 1~1002. 写一个类实现 Runnable打印 1~1003. 主线程 子线程交替执行4. 测试 sleep 阻塞自我检测1. 手写两种线程创建方式并运行2. 说出直接调用 run() 为什么不是多线程3. 说出 sleep、yield、join 的作用周二线程安全问题 synchronized 同步代码块2.5h核心知识点1h- 线程安全出现条件多线程 共享数据 多条操作- 同步锁 synchronized 作用- 同步代码块写法- 锁对象this、类名.class、任意对象- 售票案例问题复现超卖、重复卖代码实操1.5h1. 模拟 3 个窗口卖 100 张票不加锁复现问题2. 加 synchronized 同步代码块解决安全问题3. 测试不超卖、不重复、不负数自我检测1. 写出安全售票代码2. 说出什么时候会出现线程不安全3. 说出 synchronized 锁的是什么周三synchronized 同步方法 静态同步方法2.5h核心知识点1h- 同步方法public synchronized void method(){}- 同步方法锁对象是 this- 静态同步方法锁对象是 类.class- 同步优缺点安全但性能降低代码实操1.5h1. 把售票代码改成同步方法2. 写一个静态方法多线程调用测试3. 对比代码块与方法的使用场景自我检测1. 写出同步方法版本售票2. 说出同步方法和同步代码块区别3. 说出静态同步方法锁的是谁周四volatile 关键字 内存可见性2.5h核心知识点1h- JMM 内存模型简单理解- 可见性问题一个线程改值另一个线程看不到- volatile 作用保证可见性、禁止指令重排- volatile 不能保证原子性代码实操1.5h1. 写一个线程死循环示例复现不可见问题2. 加 volatile 解决可见性3. 理解volatile 适用场景状态标记自我检测1. 写出可见性问题示例 解决代码2. 说出 volatile 作用与局限3. 说出volatile 能替代锁吗为什么周五线程池入门 Executors 工具类2.5h核心知识点1h- 为什么要用线程池避免频繁创建销毁线程- 线程池核心参数入门版理解- 核心线程- 最大线程- 队列- Executors 常用创建方式- newFixedThreadPool- newCachedThreadPool- newSingleThreadExecutor代码实操1.5h1. 创建固定 3 线程的线程池2. 提交 10 个任务给线程池执行3. 使用 shutdown() 关闭线程池自我检测1 手写线程池代码并执行多任务2. 说出线程池好处3. 说出为什么不建议频繁 new Thread()周六ThreadPoolExecutor 基础 多线程综合案例2.5h核心知识点1h- 手动创建 ThreadPoolExecutor7个参数简单理解- 拒绝策略入门- 多线程综合业务思路代码实操1.5h做一个综合案例- 多线程同时录入学生信息到共享 List- 保证线程安全- 使用线程池执行- 最终打印所有学生信息自我检测1. 写出安全的多线程录入案例2. 程序运行无异常、数据不乱3. 能说出哪里用了锁、哪里用了线程池周日本周复盘 代码重构 Git 提交2.5h学习内容1h1. 复盘易错点- 锁对象不一致导致锁失效- 混淆 start() 和 run()- volatile 不能保证原子性- 线程池关闭方式2. 整理笔记线程、同步、线程池代码实操1.5h1. 重构本周所有代码- 规范命名- 加注释- 抽取工具方法2. 把所有案例整理到一个项目3. Git 提交bashgit add .git commit -m feat: 第三周 多线程同步线程池git push本周终极通关检测1. 能手写两种线程创建2. 能写出安全售票代码同步代码块/方法3. 能用 volatile 解决可见性4. 能用线程池执行多任务5. 能完成一个安全的多线程业务案例6. 代码规范、已提交 Git