热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

总结_OO第二单元单元总结

本文由编程笔记#小编为大家整理,主要介绍了OO第二单元单元总结相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了OO第二单元单元总结相关的知识,希望对你有一定的参考价值。



总述

  OO的第二单元主题是电梯调度,与第一单元注重对数据的输入输出的处理、性能的优化不同,第二单元的重心更多的是在线程安全与线程通信上。这此次单元实验之前,我并未对线程有过了解,更谈不上“使用经验”,整体上第二单元三个实验也做的较为吃力。三次实验,也算是对线程的一步步入门吧,以及由于对于线程不是很熟悉,所以我总是下意识的把程序分割,尽量减少通信量。


第一次实验

  基本需求:单电梯、无捎带要求、基本无性能要求。

  基本实现:一个主线程或者一个主线程与一个电梯线程

  我采用的方法是使用一个主线程,因为实际上,对于第一个实验唯一让人认为要使用线程的地方可能就是模拟电梯上下层所需要的时间了,但是事实上我们可以通过让主线程sleep的方式来完成此功能。以下是相关类图....

 技术图片

  总结:第一次实验是入门的铺垫,对于线程相关要求很低,对于我而言,可以说是给予了一定的缓存时间来完成两个之间单元的切换。


第二次实验

  基本需求:单电梯、傻瓜式捎带。

  基本实现:多线程

  第二次实验与第一次实验最大的不同在于,由于存在捎带也就有了一定的性能要求,故而很难去用一个主线程去做。事实上,我认为如果牺牲性能,就第二单元的电梯调度而言,是可以用一个主线程去模拟的。一个显而易见的做法就是一次只乘一个人。不过这又是另外的事情了。话说回来,第二次实验我采用的方法是,一个主线程负责接收请求,一个电梯线程负责模拟电梯的运行以及内部自行调度

  说到调度,由于电梯运行是一个在线问题,关于调度的优化算法很难去证明是否有效(严格证明优化算法的期望性能是一件很难的事情),即使做出了期望性能优秀的算法,还有可能会因为数据的边界性而表现糟糕。总的而言,就是很难优化,优化了之后也不见得有什么用。基于以上思想,对于调度算法,我的实现并不复杂,基本是按照指导书的傻瓜式捎带而写成的。

  这里值得一提的是,采用贪心可能有一定效果,不过最终还是看脸,至于其他的许多算法感觉都是在面向个例优化(这里只是个人感觉,无其他任何意思)。以下是第二次电梯的相关类图

 技术图片

  总结:从日常交流来看,第二次实验有许多大佬花了很多时间在做相关调度优化。而我由于实力有限,把重心主要放在了对线程的安全、线程的通信控制上面,我的理念是降低耦合,降低结构复杂度,能不锁就不锁,能自己分析清楚的,就不交给安全机制来写。


第三次实验

  基本需求:多电梯多楼层、捎带换乘,有一定性能的要求。

  基本实现:多线程

  第三次实验在第二次的基础上,增加了电梯的数量,并且每一个电梯有了自己的容量、区间、运行时间等等信息。并且在这种情况下,对程序的性能提出了要求。我采用的方法与第二次实验类似使用一个主线程处理请求,另外设置一个电梯线程来负责调度。之所以这样做,一方面是自己懒惰了,另一方面也是过于相信自己的码力了,到最后才发现自己驾驭不了。以下是第三次实验的类图。

 技术图片

  总结:第三次实验我的强测分没有及格,究其原因一方面是没有进行有效的对拍测试,一方面是过于注重对于线程安全方面的考量而忽略了程序本身的业务逻辑。不过这也是由于缺乏信心,多线程还是接触的少了,总是担心会出现各种线程安全的问题。


Bug分析及相关测试策略

  三次实验我都没有去测试其他同学,主要是因为多线程本身的不确定性,以及对于多线程很难去对拍测试实现自动化,又不想用其他人的。所以最后结果就是自己被测爆了。不过私下交流主流的测试策略应该都是实现自动化,然后随机数据跑,判断结果的正确性就按照指导书的正确性判断思路。

  在第三次实验,我在强测中出现了bug,在互测中也被同学发现了bug,具体bug原因是因为我的调度逻辑考虑的不周全,具体情况是,在某些情况下,一个电梯可能会在同一个楼层反复接一个人,这虽然只是影响性能,但是由于我的设计中压根没有想到有这种情况发生,所以导致了我的电梯会出现连续arrive同一层的错误输出。修改起来还是挺方便的,对于arrive的输出判断一下就行了。


心得体会:

  线程安全总是会纠结“加不加锁”、“加几个锁”,“加多了结构复杂怎么办”等等问题,我在三次实验中对于线程安全的处理总原则就是,能不加就不加,能不写锁就不写锁,能降耦合就降耦合。

  这样做的好处就是程序的结构不会看起来特别的复杂、零乱,坏处就是对于一些隐式的线程安全问题的分析,需要考虑全面,否则容易造成死锁等等。

       有得有失吧,其实有时候程序的结构复杂一点,也只是编码上繁琐 一点吧,实现上还是挺方便的,这一点仁者见仁,智者见智吧。

 

 

 

 

 

 

 

 


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
LYJ189_163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有