面向对象程序设计 第二单元总结
我觉得老师说的“第一单元最难”是假的乌乌
同步块的设置和锁的选择:
第一次作业由于我对线程的理解不深,我直接将同步块设置在了elevator类的run方法的循环中,如下所示。
while (true) { synchronized (taskchart) { }
}
这导致在电梯运行期间,elevator类将会始终持有锁,而此时请求锁的input类则无法向共享对象写入新的电梯请求,线程切换间隔极长,用jprofiler模拟后,input类几乎始终处于阻塞状态。
第二次作业我学习了线程安全类的概念和写法,并将其应用到了代码中,如下所示
public class Taskchart { public synchronized void inputrequest; public synchronized ArrayList<Requestme> chooseperson; }
通过将同步块整合到共享对象类中,实现了线程安全类,这样既便于维护线程安全,也使得程序的线程切换速度提高,输入和电梯的运行可以同步进行。
第三次作业的同步块设置与第二次相同。
至于上锁对象的选择,三次作业我都选择了任务列表taskchart类,该类对象作为共享对象由elevator类和input类共享,存在读写的线程安全问题,需要对该对象上锁。就如chooseperson方法,从当前任务列表中挑选合适的请求加入等待队列,该方法主要从共享对象中读取数据,为避免在读取时,共享对象被修改,要对该方法加锁。
调度器设计:
第一次作业的调度器几乎没有,只是根据时间先后的顺序读取请求队列中的请求,性能较差。
第二次作业的调度器是基于look算法,将请求依次送入各部电梯的等待队列,每次一个请求。
第三次作业的调度器和第二次基本相同,但是增加了一个楼层合法的判断方法,只有楼层符合电梯类型的请求才会被送入对应电梯的等待队列。
第三次作业架构设计:
本次作业我的UML类图如下:
UML协作图如下:

在第三次作业我设计了elevatortype类,用以区分不同类型的电梯,只要将不同型号电梯的参数输入构造器,就能构造不同类型的电梯,可扩展性强。除此之外,策略类与执行类是分开的,并且在taskchart类中设置了专门的策略类,可以随时加入不同的子类来更换策略,可扩展性较好。
心得体会:
在第二单元中,我主要学习到的就是线程安全。线程安全是针对多个线程共享对象而言的,由于多个线程同时执行,导致他们可能同时对同一个对象进行读写操作,由于共享对象的状态不确定而引发线程错误。为解决线程安全问题,就要使用锁来保护共享对象,使其在同一时间只会被一个线程所访问。而将同步区集中到共享对象类中,也就是构建线程安全类,是实现线程安全的一个良好方法。
另外还有层次化设计的问题,在设计时一定要将策略类与执行类解耦,实现策略类的灵活更换。这样可以使线程的运行逻辑清晰,也方便策略类的debug。


浙公网安备 33010602011771号