当前位置: 首页 > news >正文

LeetCode 1114. 按序打印

目录

LeetCode 1114. 按序打印:多线程顺序控制的核心逻辑(附完整代码)

一、题目核心需求

二、解题核心思路:锁 + 标志位 + 线程通信

三、完整代码实现

四、关键知识点总结


LeetCode 1114. 按序打印:多线程顺序控制的核心逻辑(附完整代码)

最近练习了 LeetCode 的「按序打印」问题,正好借此梳理多线程顺序控制的核心思路 —— 这是并发编程的基础考点,分享给刚学 JUC 的朋友~

一、题目核心需求

实现一个Foo类,让三个线程分别调用first()second()third()严格按first→second→third的顺序打印(即使线程启动顺序打乱)。

二、解题核心思路:锁 + 标志位 + 线程通信

要让多线程按固定顺序执行,核心是 **“控制前置方法的执行状态”**,这里用「synchronized锁 + 布尔标志位 +wait/notifyAll通信」实现:

  1. 标志位:用firsttestsecondtest标记 “前序方法是否执行完成”;
  2. 专属锁对象:创建private final Object lock作为同步锁(避免外部干扰);
  3. 线程通信:用lock.wait()让线程等待(释放锁),lock.notifyAll()唤醒后续线程。

三、完整代码实现

class Foo { // 标志位:标记前序方法是否执行完成 private boolean firsttest = false; private boolean secondtest = false; // 专属锁对象:保证锁的封闭性和唯一性 private final Object lock = new Object(); public Foo() { } public void first(Runnable printFirst) throws InterruptedException { synchronized (lock) { // 执行first逻辑 printFirst.run(); // 标记first已完成 firsttest = true; // 唤醒等待lock的线程(second/third) lock.notifyAll(); } } public void second(Runnable printSecond) throws InterruptedException { synchronized (lock) { // 循环等待:直到first执行完成(防止虚假唤醒) while (!firsttest) { lock.wait(); } // 执行second逻辑 printSecond.run(); // 标记second已完成 secondtest = true; // 唤醒等待lock的线程(third) lock.notifyAll(); } } public void third(Runnable printThird) throws InterruptedException { synchronized (lock) { // 循环等待:直到second执行完成 while (!secondtest) { lock.wait(); } // 执行third逻辑 printThird.run(); } } }

四、关键知识点总结

  1. 专属锁对象的设计private final Object lock而不是this

    • private:避免外部代码滥用锁;
    • final:防止锁对象被意外替换;
    • Object:轻量化,仅用其 “对象身份” 做锁。
  2. 为什么用while而不是if判断标志位?防止虚假唤醒(线程可能无原因被唤醒),while会二次检查标志位,确保只有前序方法执行完才继续。

  3. wait/notifyAll的作用

    • lock.wait():释放锁,让前序线程执行;
    • lock.notifyAll():唤醒所有等待该锁的线程,传递 “前序已完成” 的信号。
http://www.cnnetsun.cn/news/113696.html

相关文章:

  • 你的音效素材库该升级了!这个网站的分类细到超出你想象
  • Agent的“话痨”病有救了!微软黑科技教你压缩对话历史,让AI告别失忆,这篇教程太顶了!
  • ARMv7 linux中断路由以及处理
  • 【详解】基于Kubernetes部署Kafka集群
  • AIoT:从万物互联到万物智联的进化之路
  • ERROR in ./node_modules/vue-router/dist/vue-router.mjs 被报错折磨半天?真相竟是……
  • Spring Boot 自动配置的底层实现原理
  • AI如何帮你快速掌握Wireshark端口过滤技巧
  • 手把手教你复现CVE-2023-51767漏洞
  • 雷柏V500Pro键盘新手必看:5分钟搞定基础设置
  • Java小白必看:5分钟上手MD5加密解密
  • AI一键搞定Java8安装:快马平台智能配置指南
  • 二叉排序树的构建与遍历
  • AI风险行为识别系统开发:给安全防护装个“智能哨兵”
  • After Effects Roto Brush 3.0:甲方没给绿幕也要“抠人”?AI 帮你 3 秒钟搞定逐帧噩梦
  • 1分钟搞定!用zip命令快速打包你的项目原型
  • 28、Linux 文件和目录管理全解析
  • 雷科电力-REKE610D绝缘油介质损耗电阻率测试仪
  • 对于设计IT系统的相关思路
  • 轻量无负担!2025 年 3 款小巧型文件加密软件分享
  • Canoe-Autosar网络管理自动化测试脚本 Capl源码,全套,修改项目配置可以直接使用...
  • 亚马逊、速卖通采购测评:构建安全环境,保障高效下单指南
  • 软连接vs硬链接:哪种更能提升你的工作效率?
  • 完全合作型博弈:当所有人的利益捆绑在一起 (Fully Cooperative)
  • 挖SRC必须知道的25个漏洞提交平台
  • AI市场舆情分析榜,原圈科技领跑研报神器
  • AI一键生成Python安装包配置脚本
  • 零基础学网安不慌!电脑小白 4 阶段入门路线,分阶段学习不踩坑
  • 传统锁 vs Redisson分布式锁:效率对比实测
  • 封神!从开发转安全渗透工程师,这是我做的最对的职业选择