【软件构造】课程提纲(7)

第十章

1. 进程和线程:两种不同的并发模块

(1)进程:正在运行程序的一个实例,拥有自己私有专用的内存空间

  ·可抽象为虚拟计算机,拥有独立的执行环境和完整的资源

  ·进程间通常不共享内存,不能访问其他进程的内存和对象,需要特殊机制

  ·进程通信采用消息传递方式,即标准I/O流,为了实现进程间通信,大多数操作系统都支持“进程间通信(IPC)资源”,如管道和socket

(2)线程:正在运行程序的一个执行路径(一个进程可对应多个线程)

  ·线程有自己的堆栈和局部变量,但是多个线程共享内存空间

  ·可抽象为一个虚拟处理器,有时也称为轻量级进程

  ·线程存在于进程内,与进程中的其他线程共享相同的资源

  ·采用内存共享机制通信,需要特殊处理才能实现消息传递和私有内存

2. 线程的创建和启动、runnable

(1)所有的线程都需要实现Runnable接口,在run()中写具体实现

   

(2)创建Thread子类型

   

(3)提供一个Runnable对象

  

(4)惯用法:用一个匿名的Runnable启动一个线程,避免创建命名类

   

3. 时间分片、交错执行、竞争条件

(1)时间分片

  ·在某时刻,一个运行核心上只有一个线程可以运行

  ·当线程数多于处理器数量时,并发性通过时间片来模拟,处理器切换处理不同的线程

(2)交错执行:时间片的使用不可预知且非确定,线程可能随时暂停或恢复

(3)竞争条件:程序的正确性(后置条件和不变量的满足)取决于并发计算A和B中事件的相对时间,例如A和B都需要从银行中取走全部存款,A取走时B可能不知道,导致了没有足够的存款,产生竞争

4. 线程的休眠、中断

(1)休眠

  ·sleep():让当前线程暂停指定时间的执行

  ·join():确保当前线程能够执行完毕

  ·wait():释放锁,让线程进入等待,直到调用notify()

(2)中断(interrupt)

  ·每个线程都有中断状态,初始为false

  ·若该线程在执行低级可中断阻塞方法,取消阻塞,抛出中断异常,否则设置中断状态为true

  ·在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情

  ·当一个线程中断另一个线程时,被中断的线程不一定要立即停止,只需在愿意并且方便的时候停止,为安全地构造可取消活动提供了更大的灵活性

  ·如果活动在正在进行更新的时候被取消,那么程序数据结构可能处于不一致状态,中断允许一个可取消活动来清理正在进行的工作,恢复不变量,通知其他活动它要被取消,然后才终止

5. 线程安全:无论如何执行,不许调度者做额外的协作,都能满足正确性

(1)Confinement:限制可变变量的共享

  ·将数据限制在单个线程中,避免线程在可变数据上进行竞争

  ·局部变量保存在线程栈中,每个调用都有自己的变量副本,如果是对象的引用,则要确保不能引用任何其他线程可访问的对象

  ·在多线程环境中,取消全局变量,尽量避免使用不安全的静态变量

(2)Immutability:用不可变的共享变量

  ·解决了因为共享可变数据造成的竞争,可以安全地从多个线程访问final

  ·这种安全性只适用于变量本身,仍需确保变量指向的对象是不可变的

  ·如果类型的对象在整个生命周期中表示相同的抽象值,则类型不可变

  ·若改变对用户不可见,且对应抽象值不变,允许对rep进行更改

  ·不变性的强定义

    - 没有改变数据的操作

    - 所有字段均为private和final

    - 没有表示泄露

    - 表示中的任何可变对象都不能变化

    - 不存储传递给构造函数的外部可变对象的引用

    - 避免在方法返回值中包含对可变对象的引用

(3)Threadsafe data type:将共享数据封装在线程安全的数据类型中

  ·如List、Set、Map等数据结构是不安全的,线程安全提供了Connections的类型,可确保方法是原子的(动作的内部操作不会同其他操作交叉,不会产生部分完成的情况),例:private static Map<Integer,Boolean> cache = Collections.synchronizedMap(new HashMap<>());

  ·统一采用包装类的形式,确保抛弃对底层非线程安全容器类的引用

  ·迭代器仍然不安全,在迭代collection的时候需获取集合的锁

  ·原子操作仍然不足以完全避免竞争,如检查集合是否为空的时候,另一个线程可能提前取走了元素

  ·包装的实现是将所有的实际工作委托给指定的容器,但在容器的基础上添加额外的功能

(4)Synchronization:使用同步来防止线程同时访问变量

  ·锁是一种实现同步的抽象,某一时刻最多允许一个线程拥有锁

  ·锁的两种操作

    - 获取锁的所有权:如过锁被其他线程拥有,将进入阻塞状态,等待锁释放后再同其他线程竞争

    - 释放锁的所有权

  ·使用锁可以确保锁的所有者始终查看最新的数据

  ·锁只能确保与其他请求获取相同对象锁的线程互斥访问,若其他线程采用不同的锁,则同步失效

  ·当线程调用同步方法时,它会自动获取该方法对象的内部锁,并在方法返回时释放它。即使返回是由未捕获的异常引起的,也会释放锁

  ·同一对象上的同步方法的两次调用不会有交错现象

6. Message passing

(1)各个处理模块间通过信息传递来进行交互

(2)接收方将收到的消息形成队列逐一处理,消息发送者继续发送(异步方式)

(3)并不能消除竞争条件的可能性

(4)选择模型时,withdraw-if-sufficient-funds比单纯的withdraw更合适

7. 死锁

(1)由于使用锁需要线程等待,可能会陷入两个线程正在等待对方,陷入永远阻塞的情况

(2)死锁可能涉及两个以上的模块,线程间的依赖关系环是出现死锁的信号

(3)防止死锁方法

  ·对需要同时获取的锁进行排序,并确保所有代码按照该顺序获取锁定,例:

  

  ·用单个粗粒度的锁监控多个对象实例(但性能损失大)

8. 以注释的形式撰写线程安全策略

(1)需要对安全性进行这种仔细的论证,阐述使用了哪种技术,使用threadsafe data types, or synchronization时,需要论证所有对数据的访问都是具有原子性的

(2)例:

  

(3)反例:

   

原文地址:https://www.cnblogs.com/zhangyushuqing/p/9192493.html

时间: 2025-02-01 05:46:12

【软件构造】课程提纲(7)的相关文章

麻省理工18年春软件构造课程阅读04“代码评审”

本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材取自此,也是推荐的阅读材料之一,于是打算做一些翻译工作,自己学习的同时也能帮到一些懒得看英文的朋友.另外,该课程的阅读资料中有许多练习题,但是没有标准答案,所给出的答案均为译者所写,有错误的地方还请指出. 译者:李秋豪 审校: V1.0 Thu Mar 8 22:58:41 CST 2018 本次课

HIT软件构造课程3.1总结(data type and type checking)

软件构造的理论基础-ADT 软件构造的技术基础-OOP 1.编程语言中的数据类型 类型和变量  类型是变量的集合,在这些变量集合上我们可以定义运算(类似于代数系统?).栗子:boolean,int,double,String 变量是被命名的位置,这里存储着着一个特定的值.类似于萝卜和坑的关系. java中的类型 java的基本数据类型: int,long,char java的对象数据类型 String,BigInteger java中基本数据类型的字母都是小写的,而对象数据类型词节首字母大写 基

哈工大 软件构造课程 考点复习总结(第三章)

数据类型 Primitive types 基本数据类型(8种) Object types 对象数据类型(reference types 引用数据类型) Short.int .long.float.double.boolean.char.byte 如:String.BigInteger 只有值,没有ID(无法与其他值区分),不能赋值为null: immutable 有值,也有ID: 部分mutable,部分immutable 在栈中分配内存,代价低 在堆中分配内存,代价高 静态类型检查&动态类型检

哈工大 软件构造课程 复习考点总结(第六、七章)

可维护性的常见度量指标 Cyclomatic complexity 圈复杂度 Lines of Code LoC 代码行数 Maintainability Index (MI) 可维护性指数 Depth of Inheritance 继承的层次数 Class Coupling 类之间的耦合度 Unit test coverage 测试代码覆盖率 Coupling 耦合度 and Cohesion 聚合度 Coupling 耦合度: 模块之间的依赖性. Conhesion 聚合度 功能专一性.高聚

软件构造 第一章

一.课程简介 1.软件构造课程的目标 ①程序设计与实现能力 ②系统设计与实现能力 ③系统分析与评价能力 ④利用现代软件构造工具的能力 2.传统软件设计步骤 ①讨论需要写的软件并实现②测试代码并改错③重复②.图示如下 3.更好的软件设计 ①未雨绸缪②考虑非功能质量属性③考虑多种设计选择④把设计决策明确写下来 4.设计的目标.原则和模式 设计目标:编程的视野 设计原则:编程的标尺 设计模式:编程的经验 二.软件构造多维视图 1.什么是软件 (1)构成: ·程序Program:UI, Algorith

软件构造期末复习考点总结

[考点 Equals] ==是引用等价性 :而equals()是对象等价性. == 比较的是索引.更准确的说,它测试的是指向相等(referential equality).如果两个索引指向同一块存储区域,那它们就是==的.对于我们之前提到过的快照图来说,==就意味着它们的箭头指向同一个对象. equals()操作比较的是对象的内容,换句话说,它测试的是对象值相等(object equality).e在每一个ADT中,quals操作必须合理定义. 基本数据类型,也称原始数据类型.byte,sho

广州八神软件性能测试课程优秀学员作业-第1课-抓包不求人

本文档是广州八神软件性能测试课程学员DI da'da di的第1课-抓包不求人的课后作业.感谢DI da'da di同意分享.作业质量高,有价值,分享给大家共同进步和学习. 课程讨论群:319406535 也可以查看课程的免费部分学习: http://edu.51cto.com/lecturer/index/user_id-387113.html http://www.dataguru.cn/myclassnew.php?mod=new_basicforlesson&op=basic&le

广州八神软件性能测试课程最新大纲

发帖纪念下本人最近开设的一门软件性能测试方面的课程全部录制完毕, 课程URL是:http://edu.51cto.com/course/course_id-2218.html. 课程注重实战和对重要概念的剖析,整个课程时间超过2000分钟. 同时,也可以加入QQ群:319406535 一起讨论学习. 也可以通过http://www.dataguru.cn/myclassnew.php?mod=new_basicforlesson&op=basic&lessonid=323方式学习,两种方式

必须掌握的软件基础课程

大学必须掌握的软件基础课程 转自:http://blog.java1234.com/blog/articles/40.html  大学软件专业有很多课程,有些学生搞不清哪些是重点,以下是笔者根据多年经验,认真很重要的课程罗列下: 1,C语言 很重要,作为学编程的入门语言,也是众多流行编程语言之父. 2,数据结构和算法 很重要,以后深入理解一些东西有帮助,即使是Java把很多数据结构都进行了封装,但是学习本课程,可以对性能有深入理解: 3,计算机组成原理 一般,学习一下: 4,编译原理 一般,学习

【软件构造】第一章 软件构造基础(2)

二.软件构造的质量目标 1. 外部属性(主要):影响用户感受,如外观.速度等 (1)正确性:符合规格范围和计划目标 ·只保证各个层面的正确性(假设调用正确) ·检验与调试 ·防御性编程 ·形式化编程 (2)健壮性:响应规格范围外的异常情况 ·提示错误信息 ·正常退出或降级 (3)可扩展性:提供增加新功能的空间 ·固化需求以规避风险 ·设计简洁.离散化 (4)可复用性:使软件模块能够被其他程序使用 ·模式固化 (5)兼容性:跨平台.跨软件交互 ·使用标准文件格式.数据结构.接口,保持一致性 ·定义