第二次博客作业
在五六七次作业中,线程安全问题一直是个难点也是重点,稍微不注意就会有线程间的共享资源被不安全使用从而导致程序出现bug甚至崩溃,所以解决线程安全问题是一个很重要的环节。
线程安全问题的解决有多种,我个人比较喜欢使用简单粗暴的synchronized。Synchronized因为简单适用所以效率肯定会不如其他的方法,但依照现在作业的规模看这个影响并不大。查阅资料可以知道synchronized常用的有两种方法:synchronized方法和synchronized块(也可以synchronized属性,比如在上一次的上机课中就有出现,但个人感觉使用较少)。在完成作业的过程中,个人更多的习惯synchronized方法,简单易操作,不需要过多的考虑过程,只需要在感觉需要互斥访问的方法前加上该关键字就好;但是synchronized块就需要对自己程序的可能产生线程安全问题的资源有充分的认知,这样就能够精准地处理好线程安全问题,又由于可以针对任意代码块,所以更加灵活。
synchronized方法使同步锁的范围较大,而synchronized块可以让同步锁的范围变得很小,很显然synchronized方法在方法的规模越大时,性能越差(跟之前一样,这在我们的作业中感觉影响也是很小的)。但是灵活使用synchronized块的话就可以很好的解决这个问题。
出租车作业分析:
总体分为三大方面:请求方面,出租车方面,调度器方面,地图方面;
请求方面:从控制台得到请求,生成请求队列
调度器方面:处理请求队列,并将结果发送给出租车
出租车类:按照状态转换规则来行驶,接受调度器调度,自主寻找路径
地图方面:生成地图,地图相关信息的初始化
类图
类的度量
可以看到taxi类非常臃肿,这和一开始的程序结构的设计失败有着很大的关系,这导致在后续的debug过程中非常的难受。所以在在以后的作业中应该提前的准备好程序结构,这样会起到事半功倍的效果。
并且由于欠缺考虑,程序在一些极端的地方出现了几个bug,比如起始点相同的情况,恰好一车多单的情况。
通过这几次作业我觉得在每一次周作业之前都应该认真的阅读指导书,通过指导书的要求来设计程序架构,这样可以思路清晰的完成程序,并且在debug时更加容易。并且自己应该仔细的考虑可能出现的情况,让程序能够经得起测试。然后自己在写程序时发现类之间的应用思路并不是特别清晰,往往在遇到相关麻烦时就简单粗暴不顾后果的将一个类引用到另一个类中,在以后的作业中应该在这个地方特别留心。