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

OO第二单元博客

第二单元 多线程电梯 学习总结报告一、三次作业同步块设置、锁的选择及锁与代码逻辑的关系回顾本单元三次电梯迭代作业我对于锁的概念与使用、临界区保护、线程共享和资源竞争有了完整的实践理解。在整体代码结构中我主要采用对象锁的方式进行并发控制。电梯Elevator类内部全部使用synchronized (this)作为锁。电梯自身的乘客列表、等待请求队列、楼层信息、运行方向、载重数值、电梯运行状态枚举等都是多个线程会并发访问的共享数据。无论是添加外部乘客请求addRequest、接收维修/更新/回收指令还是电梯内部上下客、楼层移动、状态切换全部包裹在同步代码块中。这样设计的原因是每一台电梯都是独立运行的子线程只需要锁住自身实例就能做到细粒度加锁不会出现全局大锁导致线程阻塞等待的问题。这里值得留意的一点是在对于电梯状态进行快照时的读方法不能进行加锁否则会严重影响性能。调度器Dispatcher中针对静态共享集合加锁。全局电梯列表elevators、等待请求缓冲队列waitQueue属于全局共享资源会被输入线程、多个电梯线程同时访问修改。因此在请求分发、等待队列转移、电梯遍历唤醒等操作时都使用集合对象作为锁保证多线程修改队列时不会出现数据覆盖、请求丢失、集合并发报错等问题。当然这里直接使用 Java 中自带的线程安全容器也是可行的。锁与同步块内语句的关联同步块中只存放必须保证原子性的操作例如状态修改、队列增删、数值读写、条件判断修改组合逻辑。而像耗时的Thread.sleep、单纯的逻辑判断、循环遍历不进行写操作等内容尽量放在同步块外面。一方面可以减少锁的持有时间提高整体并发效率另一方面可以避免长时间独占锁造成其他线程大范围阻塞。同时本次作业大量使用wait()和notifyAll()等待唤醒机制而这两个方法必须写在同步块内部。电梯在无任务时会在同步块内循环等待当调度器分配新请求、或者电梯由Normal状态转变为Double状态从而要在换乘层进行避让时就必须唤醒所有等待线程让电梯重新检测任务并继续运行这样既避免空循环浪费资源也保证多线程之间能够正常地协同工作。二、三次作业调度器设计、线程交互与调度策略分析1. 调度器整体设计思路三次作业我全程采用中心化调度器模式由Dispatcher统一管控全部电梯与全部请求。在程序启动时就静态初始化 6 台主电梯与 6 台备用电梯逐个创建独立线程并启动。对于所有外部请求包括普通乘客请求、电梯维修请求、参数更新请求、电梯回收请求全部先交给调度器统一分发处理电梯本身只负责执行运行逻辑不参与请求选择做到调度与执行分离结构更加清晰。2. 调度器与各个线程的交互方式输入线程InputThread持续读取控制台输入识别不同类型请求调用调度器静态分发方法将请求上交调度器处理。输入结束后修改全局标记位并唤醒所有电梯以便电梯线程能够正常结束。调度器Dispatcher作为中间管理层接收输入线程的请求根据每台电梯当前状态、载重、位置、运行方向筛选可用电梯进而选出最优电梯并添加请求当电梯因超载、维修等原因退回请求时调度器负责二次缓存与重新分发同时调度器也参与全局维护剩余请求计数用来判断是否所有请求已全部处理从而判断电梯线程是否应当结束。电梯Elevators持续循环运行被调度器分配任务后执行接人、送客、移动楼层遇到维修、更新、回收指令时主动切换状态清空当前任务并回退请求完成单次任务后主动等待被唤醒后再次判断是否存在新任务。3. 调度策略设计与多性能指标适配本次作业中按照多个指标进行调度分配具有一定启发式性质由于具体权重参数难以确定可能可以通过大量数据对参数进行机器学习但太麻烦了就没有设计具体的代价函数。筛选优先级依次为首先过滤处于不可接收状态的电梯例如正在维修、单双梯模式限制楼层区间的电梯其次优先排除会直接超载的电梯避免了无效的载客替换优先选择当前静止无任务的空闲电梯减少乘客等待时间优先选择运行方向与乘客出行方向一致的顺路电梯减少电梯绕路最后结合电梯当前总负载、距离乘客发起楼层的远近进行综合排序。这套策略可以同时适配多项要求无论在性能还是拓展性方面的表现都较好而且不算复杂我对此较为满意。三、程序运行出现的Bug 及多线程调试方法总结1. 开发过程中遇到的典型bug1多线程数据竞争问题初期设计时因为疏忽没有给个别任务和状态变量加锁多个电梯同时读取修改共享集合偶尔出现乘客请求莫名消失、重复加载同一乘客、电梯列表遍历异常的问题。后期给所有共享资源增加同步保护后该问题完全解决。2线程无法正常结束曾经出现所有任务执行完毕但电梯线程一直卡在wait()无法退出或在请求返回重新分配前就过早结束的问题。原因是对于结束的判断不完善后通过对请求计数待处理和已处理的方法完善了全局结束条件、在其置 0 后统一唤醒全部电梯修复了上述问题。3双电梯换乘楼层死锁在换乘楼层电梯卡死。初始的逻辑是让电梯在Double状态时若在换乘层无任务停靠便自动向临层避让。后来发现其若在Normal状态抵达换乘层停靠则后续切换至Double状态时必须将其唤醒从而解决了死锁问题。4电梯超载问题未在同步块内统计实时载重上下客并发修改重量导致超重判断失效出现超重依旧运行的问题。2. 针对多线程程序的debug方法大量打印关键日志利用题目提供的TimableOutput在电梯到达、开关门、接收请求、状态切换、等待唤醒等关键位置输出信息直观观察每个线程的运行时序和可能出现bug的节点。缩小问题范围遇到并发错误时针对某一特定的特殊场景设计测试用例逐一检查各功能是否存在问题从而减小每次排查的范围。检查所有共享变量养成习惯只要是多个线程都会访问的变量全部检查是否加锁保护从根源避免线程不安全。四、结合三次作业谈谈对线程安全与层次化设计的理解1. 对线程安全的理解经过三次迭代开发我意识到多线程开发最难的地方在于资源竞争与执行时序不可控。线程安全的核心就是多个线程同时操作共享资源时必须通过加锁、限制访问顺序、保证操作原子性来避免数据错乱。所有临界资源都需要主动保护并且想清楚其中的逻辑否则程序就会在不经意之间随机出现各种bug这在现实的工程中是不可接受的且很难调试。同时也要合理控制锁的范围一味地使用大锁虽然安全但是会严重降低并发效率细粒度锁设计十分重要。另外灵活使用多种类型的锁以及线程协作的工具是多线程高效运行的关键能够让多线程按需高效无误地协同运作。2. 对层次化、模块化设计的理解本次代码的分层较为明确输入层InputThread只负责读入数据不处理业务调度层Dispatcher专注请求分配、全局管理执行层Elevator只负责单台电梯运动逻辑工具层FloorUtil、Reclaim提供通用静态方法和业务线程解耦。而在每个层次中尤其是Elevator进一步将不同的执行策略设计成单独的模块。分层设计的优势非常明显每个类职责单一代码可读性高后期迭代新功能时比如电梯的检修、更新和回收只需要在对应层增加代码例如为状态机增加新状态和相应的运行策略不会大范围改动原有逻辑并且在保证原有部分正确的前提下出现bug时可以快速定位模块极大降低多线程程序的调试难度。因此良好的层次化和模块化设计是复杂多线程项目能够稳定迭代的关键。五、大模型使用心得整体项目架构和核心调度策略全部由我自己设计确定主要使用大模型查阅多线程语法并学习锁的使用方法。对我而言依赖大模型范围地生成代码显然是不理智且不太可行的行为我们还是应当时刻保持自己的思考并借助大模型来提升自己学习新知识的效率再在自己的实践中切实巩固所学。六、第二单元学习真实体验与课程建议1. 单元学习体验相比第一单元第二单元对于多线程的学习其实在程序逻辑的复杂度上并没有提高但主要难点在于接触了全新的知识并且更加强调代码编写的严谨性。我从最开始只会简单创建线程、不理解锁的意义到一步步学习临界区、等待唤醒、死锁避免、分层调度三次作业迭代下来收获很大。同时因为运行结果不确定、bug难以复现多线程代码的调试难度远高于单线程整个开发过程需要耐心和严谨的逻辑思维。但相对应的我也在其中学到了很多成长了不少。无论如何还是恭喜自己顺利熬过了这艰难的一个月2. 课程建议首先是编写代码的时间略显不足希望可以适当延长时间期限其次是希望弱测中测能够公开全部样例或者至少公布典型样例为防止特判骗分可以让每个数据点执行特定的测试功能然后生成大量的测试用例在测试时随机选取这样避免了debug时没有头绪浪费大量时间。

相关文章:

OO第二单元博客

第二单元 多线程电梯 学习总结报告 一、三次作业同步块设置、锁的选择及锁与代码逻辑的关系 回顾本单元三次电梯迭代作业,我对于锁的概念与使用、临界区保护、线程共享和资源竞争有了完整的实践理解。 在整体代码结构中,我主要采用对象锁的方式进行并发控…...

如何快速搭建本地语音识别系统:高效隐私保护的完整指南

如何快速搭建本地语音识别系统:高效隐私保护的完整指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech TMSpeech是一款完全本地化的Windows实时语音转文字工具,通过创新的插件化架构和多源音…...

LLM作为AI对话评估裁判的实践与优化

1. 项目背景与核心问题去年参与一个AI对话系统评测项目时,我们遇到一个棘手问题:人工评估成本太高,不同评审员的标准差异大。当时团队尝试用GPT-4作为辅助裁判,意外发现它在某些维度比人类评审更稳定。这个发现促使我系统性地研究…...

LongWayToGo

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...

跟着 MDN 学 HTML day_3:(表单CSS美化实战与盒子模型三大核心属性详解)

一、学习前言 本次是跟着MDN官方文档零基础攻坚HTML前端系列的第三天学习打卡。前两天我们已经完整吃透原生表单语义结构、全套实用表单控件、表单name和value键值对提交底层原理,能独立手写合规可提交的原生基础表单。 原生默认表单自带浏览器原生丑陋样式&#xf…...

用MATLAB复现MIMO信道容量仿真:从瑞利信道建模到注水法代码详解

MIMO信道容量仿真实战:从瑞利建模到注水算法的MATLAB实现解析 在无线通信系统的演进历程中,多输入多输出(MIMO)技术堪称是突破性的创新。它通过在收发两端配置多个天线,巧妙利用空间维度资源,实现了通信容量…...

AlphaOPT:基于LLM自改进经验库的智能优化框架

1. 项目概述AlphaOPT是一个基于自改进大语言模型(LLM)经验库的优化程序构建框架。这个项目最吸引我的地方在于它创造性地将LLM的自我学习能力与传统优化算法相结合,形成了一种新型的智能优化范式。在实际工程优化问题中,我们常常会遇到传统算法收敛慢、易…...

抖音下载神器:5分钟掌握批量无水印下载技巧

抖音下载神器:5分钟掌握批量无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...

苹果微软双修党福音:Navicat如何熟悉Mac版专属快捷键_硬核实战技巧

Cmd Y 新建查询窗口,Cmd R 运行全部,F8 运行选中或当前行,Cmd Shift R 仅运行选中部分;双击表名或 Cmd D 跳转结构页;Ctrl Shift 数字秒开收藏对象;Shift Cmd C 打开数据库原生命令行。Mac版Navic…...

如何用Faster-Whisper-GUI实现高效音频视频转文字

如何用Faster-Whisper-GUI实现高效音频视频转文字 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 你是否曾为整理会议录音、制作视频字幕或转录课程内容而烦恼?手动…...

开源色彩管理革命:OpenColorIO配置为ACES的终极指南

开源色彩管理革命:OpenColorIO配置为ACES的终极指南 【免费下载链接】OpenColorIO-Config-ACES 项目地址: https://gitcode.com/gh_mirrors/op/OpenColorIO-Config-ACES 在数字内容创作领域,色彩一致性是专业制作的生命线。OpenColorIO配置为ACE…...

STL核心:vector动态数组完全指南

一、STL 整体介绍STL 是 C 标准模板库,三大核心组件:容器:存放数据(vector、string、list、map 等)算法:排序、查找、遍历、交换迭代器:容器通用访问指针STL 优势:无需手动造轮子&am…...

保姆级教程:Ubuntu 20.04/18.04系统下Atlas 300i Pro/T 芯片驱动、CANN 6.3.RC1及MindSpore 2.0环境配置详解

昇腾AI开发环境全栈配置指南:Ubuntu系统下的Atlas 300i Pro/T芯片实战 在AI算力需求爆炸式增长的今天,企业级AI加速卡的环境配置效率直接决定了算法团队的研发效能。本文将深入解析基于Ubuntu 18.04/20.04的昇腾Atlas 300i Pro/T系列加速卡全栈开发环境搭…...

ChatGPT机器人集成实战:从API调用到生产级对话系统构建

1. 项目概述:一个为机器人开发者准备的ChatGPT文档库如果你正在开发一个聊天机器人、智能客服,或者任何需要接入自然语言对话能力的应用,那么你大概率已经听说过ChatGPT的API。它的能力毋庸置疑,但官方文档更多是面向通用场景的AP…...

AI也有“失忆症“?Kenotic Labs提出的“连续性层“或许是彻底的解法

这项由Kenotic Labs独立研究机构发布的论文,于2026年4月以预印本形式公开,编号为arXiv:2604.17273,作者为该机构创始人Samuel Sameer Tanguturi。有兴趣深入了解的读者可通过该编号在arXiv平台查阅完整论文。每次打开一个AI对话窗口&#xff…...

从‘遗忘’到‘更新’:用PyTorch拆解GRU的门控逻辑,可视化理解它为何比LSTM更简单

从‘遗忘’到‘更新’:用PyTorch拆解GRU的门控逻辑,可视化理解它为何比LSTM更简单 循环神经网络(RNN)在处理序列数据时表现出色,但在面对长序列时常常会遇到梯度消失或爆炸的问题。为了解决这个问题,研究者…...

基于Alexa与GPT-4构建智能语音助手:从架构设计到部署实践

1. 项目概述与核心价值 最近在折腾智能家居和语音助手,发现一个挺有意思的开源项目,叫 alexandremendoncaalvaro/skill-alexa-chatgpt4 。简单来说,这是一个能让你的亚马逊 Alexa 设备(比如 Echo 音箱)直接调用 Cha…...

IBM Plex字体:企业级开源字体解决方案完全指南

IBM Plex字体:企业级开源字体解决方案完全指南 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex 你是否曾为寻找一款既专业又免费、既美观又实用的字体而烦恼?🤔 …...

Vernclaw Connect CLI:命令行网络隧道与连接管理的瑞士军刀

1. 项目概述与核心价值 最近在折腾一些需要跨网络、跨设备进行安全通信和管理的自动化脚本时,遇到了一个痛点:如何在不依赖复杂图形界面和重型管理平台的情况下,快速、安全地建立点到点的连接,并执行远程命令或文件传输&#xff1…...

构建人格化AI聊天系统:从提示工程到向量记忆的实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的东西,一个名为sys-fairy-eve/nightly-mvp-2026-03-28-g0dm0d3-persona-chat的项目。光看这个标题,信息量就很大,它不像一个传统的软件应用,更像是一个特定版本、特定功能的“角色”…...

Hermes Agent 15 个隐藏特性

99% 的用户只用了 8%,把价值百万的 Agent 当成了“高级 Telegram 机器人” 在 AI Agent 工具的讨论里,几乎所有人都默认了一个前提:Hermes 就是“更聪明的 ChatGPT Telegram 集成”。装好、连模型、打字、等回复、关窗口,任务完成…...

Kimi K2.6 + Claude 多代理路由栈

开发者还在为“哪家AI编码工具最好”站队,而真正出货最多的那批人早已把周账单砍到1/7 在 AI 编码工具的讨论里,几乎所有开发者都默认了一个前提:必须选边站队。要么是 Claude Code 死忠,要么是 Cursor 铁粉,要么是 GP…...

BepInEx 6.0.0:Unity游戏模组开发的终极插件框架深度解析 [特殊字符]

BepInEx 6.0.0:Unity游戏模组开发的终极插件框架深度解析 🚀 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensibl…...

CARLA与SUMO联合仿真踩坑实录:车辆速度获取不到?可能是ID映射搞的鬼

CARLA与SUMO联合仿真中的ID映射陷阱:从速度获取失败到系统协同设计 当你在深夜的实验室里盯着屏幕上静止的车辆数据时,那种挫败感我深有体会。CARLA和SUMO的联合仿真本应是智能交通系统研究的利器,却因为一个看似简单的车辆速度获取问题让整个…...

AgentNova R05.0:零依赖、本地优先的自主AI智能体框架深度解析

1. 项目概述:一个为本地运行而生的可扩展智能体框架 如果你和我一样,对市面上那些动辄需要联网、依赖复杂云服务、或者封装得像个黑盒子的AI智能体框架感到头疼,那么AgentNova R05.0的出现,可能会让你眼前一亮。这是一个处于Alph…...

游戏修改进阶:用CE修改器的代码注入功能,把‘扣血’变成‘加血’

游戏逆向实战:用CE代码注入实现"扣血变加血"的底层逻辑改造 在游戏修改的进阶领域,单纯修改数值地址已经无法满足高阶玩家的需求。当游戏采用动态地址、服务器校验或复杂的计算逻辑时,传统的内存扫描方法往往束手无策。这正是代码注…...

MagiskOnWSA:革命性Windows安卓子系统深度定制解决方案

MagiskOnWSA:革命性Windows安卓子系统深度定制解决方案 【免费下载链接】MagiskOnWSALocal Integrate Magisk root and Google Apps into WSA (Windows Subsystem for Android) 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskOnWSALocal 在Windows 11上…...

在Ubuntu 20.04上,除了OpenDaylight,还有哪些SDN控制器值得一试?

在Ubuntu 20.04上探索OpenDaylight之外的SDN控制器生态 当OpenDaylight已经成为你SDN实验环境中的常客时,是否曾好奇过这个开源控制器之外的广阔天地?作为网络工程师或SDN初学者,了解不同控制器的特性就像掌握多种工具,能让你在面…...

终极内存管理方案:Mem Reduct 三步解决Windows系统卡顿问题

终极内存管理方案:Mem Reduct 三步解决Windows系统卡顿问题 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...

douyin-downloader深度解析:抖音无水印批量下载终极指南

douyin-downloader深度解析:抖音无水印批量下载终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...