301
社区成员
发帖
与我相关
我的任务
分享锁的选择:只使用了synchronized关键词的锁。
同步块设置:给waitQueue类所有方法都加上了synchronized关键词。
在elevator类中涉及到遍历和修改waitQueue的语句块都添加了synchronized关键字。
本单元作业在设计调度器方面,没有单独设置schedule类。将调度融合在了InputThread类中。
调度器如何与线程交互:获得请求后直接分配给电梯线程。
调度策略:调度电梯时按请求输入的顺序给1-6号电梯依次分配。
如何适应性能指标:未做提升性能的板块。
Elevator类:电梯线程。实现运载人
WaitQueue类:请求队列类。实现将InputThread类调度好的队列分发给电梯。
InputThread类:输入队列并进行调度。
MainClass类:主要负责主线程启动。
此外还通过Motion枚举了电梯的不同状态:包括:wait,over,reset,move,open,reverse.
架构没有变化。只有方法新增。
UML类图及其协作:
稳定的内容:请求的接受和存储、电梯类的运行,
Schedule调度的实现:都是根据不同电梯对当前请求cost值的比较来选择分配电梯易变的内容:新增的请求、新增的不同种电梯、乘客分配方法、策略类
Schedule线程。hw7中双轿厢电梯的结束,一个电梯不能在没有乘客时立即结束,需要等待两个电梯都没有乘客时才能结束。在其中一部电梯到达换乘层之前检查另一部电梯是否在换乘层。
即在两个DcLift中维护一个共享对象,当一个电梯即将抵达换乘层时,检查该共享对象的值;
如果标记位为当前没有电梯即将抵达或抵达换乘层,则进入;
如果有电梯已经占据了换乘层,则阻塞当前进程,直到另外一个电梯离开该层。
前两次作业通过较为顺利。
但第三次作业出现下列bug导致未通过。
1.轮询。 针对轮询, 可以采用print输出调试信息, 在每一个可能出现轮询的循环中加入调试信息的输出从而判断问题的产生。
2.死锁。通过在纸上画图理清锁的顺序。
本人也经常使用DPO OJ v2网站进行代码评测。非常好用。
其实引起线程不安全最根本的原因 就是 :线程对于共享数据的更改会引起程序结果错误。线程安全的解决策略就是:保护共享数据在多线程的情况下,保持正确的取值。我们要灵活运用三种实现线程安全的方法:互斥同步,非阻塞同步,无同步方案。只有深入理解了多线程程序的原子性,可见性和有序性三个特点才能避免低级错误。
一个好的调用层次可以极大地减少线程安全问题发生的可能性。比如一个线性、单向的调用链几乎不可能发生死锁。例如可以输入线程请求队列后进入调度线程。在电梯队列和缓冲队列中进入电梯线程。处理完毕后返回输入线程。