面向对象课程第二次随笔

多线程的协同与同步控制

第五次作业

  作为第一次多线程作业,对于多线程的同步和协同机制还不是非常了解。在这次作业中,我将三个电梯作为了三个线程,输入线程和调度器线程进行辅助。输入线程和调度器线程之间采取了很简单的生产者消费者模式来进行指令的传递。比较重要的是调度器与三个电梯之间的协同,共享资源为指令与电梯的状态。由于要考虑电梯的状态进行分配指令,电梯状态的同步是十分重要的,我在电梯类中设计了一个专门的方法返回电梯状态并将这个方法synchronized来保证调度器获得的电梯状态与实际电梯状态的同步。

第六次作业

  这次作业的共享资源主要是目录下的文件,对目录下文件的检测与对目录的下文件的操作要同时进行。很重要的一个同步措施是设计一个线程安全的文件类来保证文件被改动时的同步性。我个人在这次设计中出现了一些问题。第一个就是线程的建立,我对于每一条监视指令,建立一条监视线程,然后这个监视线程不断地扫描监视目录下的文件,获得快照。好处是看起来没啥问题加开的线程比较少,不过实际处理中问题太多,最关键的一点是无法保证文件被操作的同步性。即使我将对文件的操作上锁,但是由于相同的文件(路径相同),在两个线程中建立的file索引是不同的,实际上完全无法保证线程安全。

第七次作业

  这次作业是关于100辆出租车的叫车问题。我个人认为这次线程安全的设计,和三部电梯并没有本质不同。不同在于调度策略以及更加合理的代码设计。关键依旧是对于出租车状态这个共享资源的控制,需要保证出租车的状态被锁住。对于每个请求,我不喜欢每个都开一个线程导致线程过多,我的做法是把它们放在调度器线程中,不断扫描,经过3s后自动清除。

基于度量对程序的分析

第五次作业

  以上为本次作业的代码分析,可以看到McCabe圈复杂度依然是红的,本身的方差也不算太小,但是与上一次作业相比,已经有了很大的改进。改进主要来源于对输入控制,调度和电梯类的分离。最大深度还算可以,最大的深度在scheduler类的run方法,有6层。

第六次作业

  这次作业复杂度整体和上次相似,迭代深度略深,可能是由于我采用了递归的方式来检查目录下的文件。

  这是本次作业的类图,可以看出,这次设计比较无脑,没有仔细地规划。只是单纯地对于每个目录建立监视线程。

第七次作业

  与前两次作业相比,无论是代码行数,类数,方法数都有所上升。值得注意的是,圈复杂度的方差有点过大

  究其原因,Taxi类中的findNextPlace方法值得注意,这个方法是用来帮助出租车寻找下一个要行驶的地点的。由于掺杂了多种情况,甚至包括了BFS,导致复杂度非常大。下次作业考虑重写该方法,拆分其功能,降低复杂度。

  从类图可以看出,这次作业和第五次相似,100个taxi线程同时运行,shceduler负责对他们的调配

分析自己的Bug

第五次作业

bug1:在INVALID情况下也去掉括号了,应该原版输出输入的内容

bug2:一行中指令用;隔开,对于所给输入,“;;”之间无指令应予以报错反馈,我直接当做不存在指令没有报错

第六次作业

bug1:没有忽略相同的请求

bug2:没有考虑在指令超过100条时如何处理,在超过100条时我直接选择忽略后面的指令。然而100条之内的指令有可能是无效的,所以在一次性输入过多指令时会产生Bug。

bug3:递归时记录文件出现了错误,导致对文件的记录比实际上的要少。

bug4:未准确理解指导书中关于modified的定义,原来误以为modified是只有最后修改时间变化。

第七次作业

暂时未被发现bug

发现别人Bug的策略

  检查主要是对于测试树上节点的检查,步骤为:

  基础功能检查---查看代码---分析共享资源---对于共享资源构造测试用例,检查线程安全---压力测试

  由于为多个线程同时运行的程序,在压力测试和考察共享资源管理上,比较容易出现bug,原因是线程在压力测试时开的比较多,以及共享资源导致线程不安全。

自己的分析、总结与思考

心得体会

设计原则

(1)保证类,方法的均衡性。

  出现god类之类的东西很容易有bug发生。

(2)集中化数据管理。

  很多时候我会将一组单独写成一个类便于管理,例如电梯的状态。

(3)在底层类实现方法,提供接口,顶层类直接调用,让自己的代码更有层次感、

线程安全

  我的分析思路是一开始先不考虑怎样保证线程安全。首先进行类与方法的设计,然后考虑这之间的交互,找出共享资源。最后,分析如何进行一些锁,同步措施来保证线程安全。不过有些线程安全设计不是很好,单纯的用sychronized有时候会降低并发的效率。以后应该多尝试一些书上看到的更优秀的线程安全设计。

原文地址:https://www.cnblogs.com/mbra/p/8974689.html

时间: 2024-07-31 05:39:16

面向对象课程第二次随笔的相关文章

面向对象课程第二单元总结

本单元的整体多线程冒险体验对于我来说是要比第一单元好的……原因无他,我第一单元栽倒在输入处理和正则上的比例有点高,感觉除了设计上的丑陋之处,其他的全是输入处理上的问题= =…… 当然这并不代表本单元的冒险不紧张刺激,但至少省下输入处理的精力,我在代码结构的构造上面还是下了功夫的,整体构造感觉上要比第一单元更加合理一些(也许代码度量插件不这么想orz).这其中也有老师教的合理的多线程设计模式的功劳,在已有的框架内,会把生产者消费者.仓库工人等等线程类所要完成的工作规定清楚,避免上帝类.废物类.奇怪

C#面向对象课程 类与对象,方法重载,类的静态成员,命名空间和类库12月22日

一.类是面向对象课程的基本单元. 在类的里面可以直接定义字段(成员变量),也可以定义方法(函数). 例如: 这里的public是修饰符,修饰符的作用是用来限定它的可访问范围. 两个同范围(同一个类中,或者父子类中)两个同名但参数类型不同或者参数个数不同的方法互相间构成重载关系. 两个构成重载关系的方法(函数)必须满足以下条件: (1)方法(函数)名相同: (2)参数类型不同,或参数个数不同.这里需要注意的是,函数返回值类型的不同不是函数重载的判断条件. 二.静态成员 属性.方法和字段等成员是对象

【雅思基础课程】语法基础课程-第二讲

雅思语法基础课程-第二讲 第二讲 一切从简单句开始之 S Vt O 机器吞了我的卡! The machine eats my card! --- 指经常吞卡,现在.过去.将来,不符合常理 The machine ate my card! --- S + Vt + O 这样符合常理,只吞了一两次 \1. S= n. / pron. / to do/ 主语从句 1.n. 2.pron. 代词 3.to do 4.主语从句 \2. O= n. / pron. /to do/ 宾语从句 1.n, 2.p

面向对象课程第三次随笔

一.规格化设计的发展历史 20世纪60年代,软件出现严重危机,Dijkstra提出了goto语句的危害,由此引发了软件界长达数年的论战,并产生了结构化程序设计方法.Pascal语言在20世纪70年代占有统治地位. 随着计算机技术的发展,结构化设计语言和结构化分析无法满足用户的需求,OOP由此应运而生,即面向对象的程序设计.OOP的诞生是程序设计方法学的一场革命,大大提高了开发效率,减少了软件开发的复杂性,提高了软件的可维护性,可拓展性.1990年以来,面向对象分析.测试.度量和管理研究都得到长足

体系化的面向对象课程

按:面向对象是绝大多数计算机专业学生的重要课程,北航也不例外.事实上,北航开设OO课程已经有十几年的历史,梳理一下历史发展脉络,基本可以分成三个阶段:第一阶段,面向对象概念与UML表示,那时Java的使用还不是很普遍.这个阶段课程的特点是侧重于介绍UML语言,以及如何使用UML分析和描述一个软件的概要性设计.第二阶段:面向对象概念的程序化表达,由于UML是一个比较抽象的描述性语言,大二学生不易理解和掌握,特别是在应用方面.此阶段课程开始引入Java语言,并在UML与Java之间建立了面向对象概念

《Java面向对象编程第二版》今年出版以来获得读者一致好评。

<Java面向对象编程第一版>自2016年出版以来,承蒙读者们的厚爱,至今已经重印了二十多次,成为国内Java领域里的经典Java技术宝典.在当当网上获得了1500多条好评: http://product.dangdang.com/9186890.html?point=comment_point 应广大读者的要求,为第一版进行了升级,第二版融合了最新的Java8的语言特性,它继续为Java开发人员们提供丰富全面的技术支持和帮助.在京东网上读者们对第二版的好评如潮,一致认为这是Java开发人员必

前端学PHP之面向对象系列第二篇——魔术方法

显示目录 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这些方法为面向对象实现提供了便利,本文将详细介绍魔术方法 构造方法 大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函数,通常用它执行一些有用的初始化任务 构造函数的声明与其它操作的声明一样,只是其名称必须是两个下划线__construct( ).这是PHP5中的变化:

《Java面向对象编程第二版》即将出版

<Java面向对象编程第一版>自2016年出版以来,承蒙读者们的厚爱,至今已经重印了二十多次,成为国内Java领域里的经典Java技术宝典.应广大读者的要求,在过去的几个月,为第一版进行了升级,第二版融合了最新的Java8的语言特性,希望它能继续为Java开发人员们提供丰富全面的技术支持和帮助. 本书技术支持网址为:www.javathinker.net

ACCP8.0 java课程第二学期-关于继承

本章重点: 继承的概念,重写与抽象类本章难点: 1.理解存在继承关系时创建对象时的内存调用原理 2.理解抽象类 学习方法: 1.自己多想例子并分析,有了思路立刻动手实现,不要空想社会主义 2.根据需求找父类,定子类,发现属性,归纳特征 1.继承1.1 继承是面向对象的特征之一,子类继承父类则子类能拥有父类的方法与属性,这样的好处是复用代码,使结果清晰,它是多态的必要条件1.2 需要继承的类访问修饰符不能用protected 和 private修饰1.3 Object是所有java的类的父类,如果