301
社区成员
发帖
与我相关
我的任务
分享使用synchronized进行加锁。同时,共享对象的成员函数不引入对该对象的加锁,而是由调用者在外部加锁.
使用synchronized进行加锁。当调用者需要使用多个锁时,按照指定加锁顺序进行加锁。
电梯调度使用synchronized进行加锁,轿厢保护使用ReentrantLock进行加锁。尽量将可能涉及多个锁的操作,拆分为若干单个锁的操作。
图1 第三次作业UML类图
图2 第三次作业UML协作图
稳定内容:核心功能“调度”稳定不变,所以“输入-调度-运行”的整体代码架构稳定不变。
易变内容:可能会增加不同种类的电梯。
为换乘楼层引入ReentrantLock进行保护:在电梯进入该楼层前,需要获取锁;当电梯离开该楼层后,释放锁。同时,当位于换乘楼层的电梯没有主请求时,电梯自动换乘楼层
修复了“当主请求为从1楼到8楼,且当前楼层为8楼时,在去1层的过程中,非主请求将电梯填满导致主请求无法上电梯”的bug
修复了RESET-BEGIN输出时机错误的bug,RESETOUT中部分完成请求重新进入InputRequestList的bug,当InputThread结束后直接结束ScheduleThread的bug,ScheduleThread将过多的请求加入一个电梯的ElevatorRequestList的bug,CPU空转的bug
修复了新电梯离开换乘楼层是没有释放锁的bug,RESET和换出后没有清除主请求的bug
在指定位置打印当前状态来查看线程死锁时的运行上下文
复习了线程调度的知识,深入理解了线程同步的设计理念。