OO第二单元总结

OO第二单元总结

一、同步块的设置和锁的选择

输入接口在接受输入时获得waitingqueue锁,一次输入结束时notifyAll,调度器获得锁并分配乘客。

多线程电梯为每部电梯设置一个waitingqueue队列。当waitingqueue为空时,wait()等待输入接口接受输入。电梯每到达一层时,wait()释放锁等待输入。

二、调度设计

第一次作业:

考虑单部电梯的调度,由于不用考虑其他因素,由电梯对waitingqueue里的乘客进行调度。

若电梯里有乘客,则优先运送电梯内乘客到目的楼层,每经过一个楼层判断是否有乘客可以上电梯,如果满足条件则加入电梯乘客队列。

若电梯没有乘客,则对waitingqueue里的乘客进行判断找出最近的乘客优先运送。

第二次作业:

考虑多部电梯的调度,为每部电梯分配一个waitingqueue队列,调度器为每部电梯单独分配乘客,若拿到增加电梯的指令,则同样增加一部电梯和对应的waitingqueue队列。

第三次作业:

与第二次作业相同,只是三种电梯的各项数据不同,调度器分配乘客的时候需要考虑到达楼层和目的楼层。

三、功能设计和架构设计

image-20210427211756506

 

 

image-20210427212256391

可拓展性分析:第三次作业中并未采用高效的方法分配乘客给不同类型的电梯,因此当遇到更多更复杂类型的电梯时可拓展性不强,仍有许多需要改进的方法。

四、bug总结

这三次作业互测没有被检出bug,也没有检出别人的bug,但自己在设计时出现了死锁的bug,经分析是未进入每一个线程分别唤醒进程。

五、分析他人bug

互测阶段并没有成功检出他人bug

六、心得体会

多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,且不需要进行额外的同步或者在调用方进行其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

posted @ 2021-04-27 21:33  18231102  阅读(57)  评论(0)    收藏  举报