精华内容
下载资源
问答
  • 本文将描述如何使用原型实现JavaScript面向对象编程。 <h2>2. JavaScript面向对象的基本概念 在讲基于原型面向对象编程之前,需要先理解JavaScript三个很重要的概念:构造函数(constructor&#...
  • 在问题领域发现和描述对象(或概念)*从问题发现需求然后从需求中抽象出对象 * finding and describing the** concepts in (not software object or class) **the problem domain 3、什么是Object-o

    chpater1

    1、什么是分析和设计

    分析:对问题和需求的调查研究

    设计:满足需求的概念上的解决方案

    做正确的事(分析)和正确地做事(设计)

    2、什么是Object-Oriented-Analysis (面向对象分析)

    在问题领域发现和描述对象(或概念)*从问题发现需求然后从需求中抽象出对象 *

    finding and describing the** concepts in (not software object or class) **the problem domain

    3、什么是Object-oriented-Design(面向对象设计)

    定义软件对象以及他们如何协助以实现需求

    defining how the software objects collaborate to fulfill the requirements

    4、什么是UML(统一建模语言)

    统一建模语言 是描述、构造和文档化系统制品的可视化语言

    a visual language for specifying, constructing and documenting the artifacts of systems

    5、为什么需要UML

    1. Use graphic notation to communicate more clearly than nature language (imprecise) and code (too detailed)

      使用图形符号比自然语言和代码能更清晰地交流

    2. Help acquire an overall views of a system

      帮助获取系统的整体视图

    3. UML is not dependent on any one language or technology

      UML不依赖任何语言和技术

    4. UML move us from fragmentation to standardization

      UML使我们从零碎到标准化


    chpater2

    1、什么是UP(统一过程)

    软件开发过程描述了构造、部署和维护软件的方式

    UP is an Iterative and Evolutionary Development,Sample structure to apply OOA/D and UML

    RUP(Rational Unified Process):对UP的精化

    2、为什么使用UP

    1. UP is an iterative process.
    2. UP practices provide an example structure for how to do and thus how to explain OOA/D
    3. UP is flexible, and can be applied in a lightweight and agile approach

    3、什么不是UP

    waterfall lifecycle 试图在编程前定义大部分或全部的需求,是一种linear方法

    4、What is Iterative and Evolutionary Development(迭代和进化式开发)?

    迭代: development is organized into a series of short, fixed-length (for example, three-week) mini-projects 开发被组织成一系列短的、定长的小项目,相当于每次只实现系统的一部分

    迭代的优点(P17

    • less project failure, better productivity, and lower defect rates
    • early rather than late mitigation of high risks
    • early visible progress
    • early feedback, user engagement, and adaptation leading to a refined system that more closely meets the real needs of the stakeholders
    • managed complexity
    • the learning within an iteration can be methodically used to improve the development process itself, iteration by iteration

    Inception初始阶段

    chapter4

    1、什么是Inception

    预测项目的范围、设想和业务案例(Envision the product scope, vision, and business case)初始阶段不是需求分析而是可行性分析

    解决的主要问题:涉众是否对项目设想达成基本一致,项目是否值得投入认真的调查

    Do the stakeholders have basic agreement on the vision of the project, and is it worth investing in serious investigation

    2、初始阶段会创建的制品(Artifacts)

    • Vision and Business case 设想和商业用例
    • Use-case Model 用例模型——按功能需求,在初始阶段确定大部分用例名并详细描述10%的用例
    • Supplementary Specification 补充性规格说明——考虑对架构会产生主要影响的非功能性需求
    • Glossary 词汇表——描述领域术语和数据字典
    • Risk list and Risk Management Plan 风险列表和风险管理计划
    • Prototypes and proof-of-concepts 原型和概念证明
    • Iterations Plan 迭代计划
    • Phase Plan and Software Development Plan 阶段计划和软件开发计划
    • Development Case 开发用例

    chapter6

    1、什么是用例

    用例是文本形式的情节描述,说明某参与者使用系统实现某些目标

    用例图:P68

    2、用例的组成

    用例组成 注释
    用例名称 动词开始
    范围Scope 归属的系统
    级别 用户目标或子功能
    主要参与者Actor
    涉众及关注点Stakeholder and Interests 用例涉及到哪些用户以及他们的利益,例如管理员希望能快速、准确添加数据并且没有错误发生
    前置条件 Preconditions 用例开始前必须为真的条件,例如用户必须已登录
    后置条件 Postconditions 用例完成必须满足的条件,例如库存信息被更新
    主成功场景 Main Success Secnrio 用例主事件流
    拓展 Extensions 对主事件流的拓展,例如密码错误时会发生的事件流
    特殊需求 用例相关的非功能性需求,例如界面支持中英文、响应时间小于多少秒

    参考文献
    (美)Carig Larman著. UML模式和应用(原书第三版)[M]. 李洋等译. 机械工业出版社, 2006-05

    展开全文
  • 这个描述将会直接指导最终生成的软件,业务模型是否具有扩展性,业务模型是否能够正确的反映需求,都将影响最终软件的质量。 1.业务建模 1.1为什么要业务建模? 我们把业务建模这个概念放在了最后...
  • 1.5.3 组织中角色是什么 1.5.4 谁该干什么?他们之间如何协作 1.6 面向对象的分析与设计例子 1.6.l 定义用况 1.6.2 定义概念模型 1.6.3 定义协作图 1.6.4 定义设计类图 1.6.5 掷骰子游戏...
  • 这个描述将会直接指导最终生成的软件,业务模型是否具有扩展性,业务模型是否能够正确的反映需求,都将影响最终软件的质量。1. 业务建模1.1 为什么要业务建模?我们把业务建模这个概念放在了最后的部分,因为面向
    业务建模

    林星 (iamlinx@21cn.com)
    2003 年 12 月

    业务建模是OOAD的重要组成部分,简单的说,业务建模就对业务领域问题进行结构化的描述。这个描述将会直接指导最终生成的软件,业务模型是否具有扩展性,业务模型是否能够正确的反映需求,都将影响最终软件的质量。

    1. 业务建模

    1.1 为什么要业务建模?

    我们把业务建模这个概念放在了最后的部分,因为面向对象是业务建模的基础。面向对象是一种用计算机语言模拟现实生活的技术。而传统的语言是基于时序的,是计算机观点的语言,和人们熟悉的社会观点是不同的。在软件发展初期时,这并不是什么很大的问题,但是当软件规模越来越大,变化的速度越来越快的时候。人们发现两种观念有了冲突。例如,订单这个对象是人类社会的一个普遍的商业名词,它是相当稳定的。所不同的只是处理规则有所不同,但在传统的语言中,订单的名词并不是关心的重点,关心的重点反而放在了订单的处理时序上。偏偏这部分的处理是不稳定的,所以就引发了变化的问题。而面向对象采用现实世界系统的思考方式,侧重于建立订单这个类型,并构造订单类型的体系,然后再建立规则。所以,他和现实世界的变化频度是基本一致,变化起来也就比较容易。

    我们之前曾多次讨论了面向对象的抽象。我们知道,面向对象用于描述现实世界,他的抽象级别还太低了。所以,后来有了组件技术。组件技术提倡松耦合、粗粒度的构建方式,但是他在本质上和面向对象并没有什么太大的差异。而业务建模的关键,就是如何利用面向对象技术来描述现实世界。

    1. 2 业务建模和数据库建模

    很多人都经历过基于数据的应用,在需求分析完毕后,立刻建立数据模型,基于数据模型构建应用。这是这种应用的典型做法。利用先进的工具,能够达到很高的开发速度,所以这种方法在CS方式的软件中被大量采用。这种方法的基本思想是使用数据库来表示业务模型。但是我们需要深入的来思考这个问题,是不是数据库能够完全胜任这一点呢?我们就最广泛使用的关系型数据库来进行讨论。

    我们知道,关系型数据库的基本原理是集合论。通过定义二维表和使用笛卡儿乘积定义二维表之间的关系来完成设计。这和我们现实生活有一定的类似之处,这是很自然的一件事情,因为数学本身就来源于生活,而软件的基础理论是数学。对于数据来说,它本身并没有很多意义,你能够说明下面这个字符串的意义吗?

    
    
    "香港XX贸易有限公司"
    
    
    

    答案是不能,但是通过数据库的表名称和表字段的定义,我们可以大致推算出他的应用范围:

    
    
    表名:
    客户列名:
    中文名称"香港XX贸易有限公司"
    
    

    我们知道,这个字符串表示了客户的中文名称。但是遗憾的是,这种的定义仍然不够精确,应该承认,它有用,但是意义并不大,对业务没什么帮助。真正对业务有帮助的描述应该是:

    
    
    "香港XX贸易有限公司"是本公司的10大客户之一,我们需要给其比较好的优惠。
    "香港XX贸易有限公司"的应付款已经到期,必须降低该客户的信用评级。
    
    

    这些事情是数据库没有办法做的。当然,现在数据库技术的发展一日千里,很多数据库都用不同的技术来帮助客户在数据库上进行业务规则的处理。但是数据库不擅长处理的东西,并没有必要强制在数据库上实现。这些事情,应该由面向对象来进行处理。因为面向对象是数据和操作的完美结合,但是面向对象有一个缺陷,就是持久化的能力很低,所以,数据库仍然是面向对象的最佳合作伙伴。因此,我们有了ORMapping技术,后来又有了JDO的技术。这些都是为了强化面向对象和关系型数据库之间的沟通而设计的,因为他们两者的设计理论不同,所以天生存在很大的隔阂,非得借助中间层次的帮助。而在敏捷方法论中,也专门有研究数据库方面的技术,这表现了数据库技术的重要程度。

    1.3 共性和差异性

    业务建模中,寻找、区分不同事物之间的共性和差异性是非常关键的。两个业务实体,之间不可能只有共性,如果那样的话,那就只会剩下一个业务实体了;反过来,他们之间也不可能只有差异性,世间万物,皆有关联。退一万步说,他们至少都属于某个组织的业务实体,都是业务实体,这也是他们的共性。在业务模型中进行正确的分析,能够为之后的面向对象建模打下坚实的基础。如果这一步做的不好,你会发现,你是在使用面向对象的技术来编写面向对象过程的代码。

    1. 4 不要把表和业务实体混为一谈

    对于业务建模而言,业务实体是非常重要的。几乎所有的业务模型,都表现为不同业务实体之间的某种协作关系。Jill Nicola在他的业务对象建模和协作模式一文中,提出了4种的协作类型,并演化出12种协作模式。应该说,他的用意,是对业务模型进行分类,其目标和GOF的设计模式一书是类似的。但是业务模型面对着的,是大千世界中的各种现象,要将它们归类整理,谈何容易。所以,Jill Nicola也仅仅是只能够提出一个思路,但这对业务建模者来说,是很有价值的。

    很多开发人员容易把表和业务实体混起来,但它们之间并没有什么联系。正如上文讨论业务建模和数据库建模的关系一样,数据库只是实现业务模型持久化特性的一种手段。把业务实体一对一映射到表,有时候是对的,有时候则不对。业务实体的设计一定是从需求开始,到领域模型,而表设计是基于数据库的处理原则。一个订单实体,在数据库中可能会有两张表,一张是订单、一章是订单子目。很多时候,业务实体的粒度要大于表,但也不一定,例如在ORMapping中,就常常把一个继承树映射到单个表中。所以它们两者之间没有必然的联系。在业务建模时,就单纯的考虑业务实体的设计,在数据库建模时,就单纯的考虑表设计,不要混淆两者。

    1. 5 警惕CRUD类型的设计

    这个问题产生的本质是数据库设计和业务模型设计的冲突。从数据库的观点来看,任何一种业务都不外乎新增记录、修改记录、删除记录、查询记录。所以象PowerBuilder那样的工具,能够凭借优秀的数据窗体的处理能够里雄踞一方。但是这个观点是业务建模中十分忌讳的,为什么呢?对任何一项业务来说,对记录的处理都不是问题的根本。新增一条记录必定伴随着一项业务的发生,例如销售了一件产品,新注册了一个用户。这种对用户来说才是有意义的,用户并不关心记录的处理,他们只关心业务问题。所以,当你的业务模型如果充满了CRUD的设计,这说明你看待业务模型的角度有问题,你仍然停留在从关系数据库看待业务的层次上。

    在软件开发过程中,这个问题需要引起注意。单纯的CRUD方法往往意味着需求没有被正确地理解,模型可能遗漏了需求。我们想象一个新增订单记录的AddOrder方法,一个订单需要填写哪些要素?新增订单时是否需要检查客户的信用记录?是否需要检查产品的库存?现实生活中的业务规则很复杂,不可能如此的简单。那么,现在你可以检查看看你的系统,是否存在着大量的CRUD设计?

    1. 6 尽可能使设计贴近现实世界

    这一点并不是绝对的,例如,理论上人的生日是不能够调整的,但是在软件的世界中,需要提供修改生日的方法来修正录入的错误。这个问题可以这样理解。对于软件系统来说,并不存在创建人这样的业务模型,这是生命的秘密,不是软件系统能够模拟的。真正有意义的业务模型应该是建立档案,招聘新员工这样的业务模型,因此修改档案和修改员工资料都是允许的。

    1. 7 显式接口和隐式接口

    想象一个用户管理模型提供特定客户的接口,不同的搜索条件使用不同的参数:

    
    
    Customer getCustomer(int customerID)
    Customer getCustomer(string customerName)
    
    

    面向对象能够很好支持重载特性,因此,这种方式声明的接口是相当优雅的。对用户来说,接口是统一的,编译器能够提示你使用合适的重载方法,并帮助你检查类型。问题在于,有一些条件具有相同的参数类型,这就和重载的要求背离了,例如:

    
    
    Customer getCustomer(string customerName)
    Customer getCustomer(string customerAddr)
    
    

    这个时候,我们就需要改变一下思路,把接口变成显式定义的:

    
    
    Customer getCustomerByName(string customerName)
    Customer getCustomerByAddr(string customerAddr)
    
    

    当方法数量比较少的时候,这种显式接口也很有优势,因为方法名清晰的表示了其意图,用户不需要太多的帮助就能够使用适当的方法。所以我们这里看到方法名的设计是很重要的,而在团队内部保持方法名风格的一致同样是很重要的。

    如果获取客户这个方法有十几中的过滤条件,我们发现,显示接口的方法是有问题的,方法列表太多,用户难以使用,而选择逻辑也开始分散,不容易进行扩展。如果说,一个业务方法复杂到了这种程度,我们认为值得多投入一些时间对方法进行改进。我们的思路是把显式接转换为隐式接口,并把过滤条件这个概念进行抽象。请注意我们这么做的理由,方法的目的是相同的,都是获取客户,但是它们的过滤条件不同,所以我们为了提高抽象性,我们把过滤条件的共性表述出来,这就是过滤条件本身。这就是面向对象的威力,不论是任何的事物,都可以在某个程度上进行抽象。所以我们引入了一个新的过滤对象,CustomerFilter。注意,我并不把它命名为Filter,因为我认为过滤是一个通用的特性,很多的对象都具有这种特性,所以,我希望在条件成熟的时候能够从CustomerFilter抽取出一个基类出来,能够将其用于OrderFilter的设计。所以我的命名为将来留有余地,但是我现在并不实现它,因为重构和自动测试技术能够帮助我很快将Filter实现出来,对这一点我毫不担心。罗里罗嗦讲了这么多,我们来看看最后的方法是什么样子的:

    
    
    Customer getCustomer(CustomerFilter customerFilter)
    
    

    显示接口和隐式接口在设计中大量存在,你无法下结论说哪一种方法比较好,任何一种方法都有其存在的价值。我们做的是根据情况来进行分析,以决定使用哪一种方法。

    那么,过滤器是如何实现的呢?过滤器实现中最重要的是就是过滤规则由谁实现。同样的,这里的设计同样是一种权衡。最标准的做法是使用正则表达式,例如"Name Like M*",这样,过滤器本身只是提供了表达式的叙述,至多再进行语法的检查而已,接受过滤器的类需要负责实现过滤功能。很多的系统中都提供了类似的操作,因此,设计时可以充分的利用它们。

    在Martin Folwer的分析模式一书中,提到了另一种过滤器的设计思路,把过滤规则封装在过滤器中,由于过滤规则封装在过滤器中,所以过滤器必须提供一个查询方法:

    
    
    isIncluded(Customer aCustomer)
    
    

    每一次,提供Customer的类需要向过滤器询问,这个客户在过滤器中吗?过滤器回答。这种做法的好处是提供了更大的灵活性,可以实现非常复杂的过滤规则。但是这种过滤规则会生成复杂的过滤器类,这并不是一个好消息。你可以使用简单的Case语句,或是子类化等方法来实现过滤策略。

    2. 规范

    业务建模不存在一个规范,不同人、不同问题,最后的设计结果一定不同。目前大家比较接收的方式是通过模式的形式来记录、讨论一个业务模型。例如,我们考虑银行的操作人员处理一项业务,这种过程活动就可以使用经典的Participant-Transaction模式来进行描述:

    image001.gif

    某种角色处理了某个交易,而这个交易和相关的人员都需要记录下来,这种情况适合采用Participant-Transaction模式来解决。模式针对某个特定环境的特点使之很适合用在业务建模中,业务建模的规范确定之后,还可以给出特定技术平台下的实现,从而达到规范代码的目的。

    3. 组织

    业务建模的组织问题和重用的组织问题极为类似。

    4. 过程

    最初的模型就保持一个稳定的状态是不太现实的。所以,把大量的时间花费在完善业务模型上并不是一个好的做法。在项目开始的时候,参与项目的双方的配合程度低,相互不能够理解对方的工作,开发方无法理解要处理的问题域,需求方也弄不清楚软件的最后模样。水源已经脏了,下游再怎么清理也是有限的。在这种情况下,你认为领域模型能有多大的稳定性?

    但是,如果业务模型不能够快速的确定下来,就会对后续的活动产生影响。所以,在开发过程中,对原先设计和代码的重构能力是非常重要的。具体的说,就是在需求变化或更加明确的情况下,需要对原先错误或不足的设计及代码进行修改,但在添加或修改原有软件的同时,能够保证原先的功能和质量不受影响。所以,为什么迭代的思路不容易贯彻,就是因为后续的变更对之前的架构容易产生影响。而在一个应用中,业务模型往往是整个软件的核心,所以软件重构的能力直接表现为业务模型重构的能力。

    对于我们来说,业务模型一方面要尽可能的稳定,少变化,另一方面我们又要求业务模型能够进行快速的变化,以适应需要。所以业务模型设计对过程提出了几点要求:

    4.1 针对业务模型构建自动化测试网

    我们说过,业务模型是软件设计的核心。任何底层的问题都会反馈到业务模型上来,而业务模型和需求非常的接近,因此测试用例的设计难度比较低。我们知道,测试工作最难的就是如何权衡测试工作量和软件质量的关系,把测试的力量集中在业务模型上,能够有不错的效果(这并不是说其它的部分不需要测试,单元测试的主要思路是测试一切可以测试的东西)。但是这种测试也需要付出额外的代价,最典型的是测试环境的建立,由于是业务模型测试,不可能象单元测试那样容易,所以需要有周全的测试数据和测试计划。这项工作应该放到业务模型的类设计中,成为进度的一部分。如果是业务模型的关联性很大,还要从整体上考虑。

    4.2 保持设计的统一

    业务模型往往是关联性很强的,而这个趋势将会越来越明显。为什么ERP会如此的复杂,就是因为业务关联性非常的复杂。所以,尽可能在业务建模活动中投入少而精的力量,保持统一的设计风格。这一点很重要,如果设计思路不统一,会对业务模型产生很大的影响。

    4.3 审核

    由于业务模型的重要程度,因此建议在每一次迭代初期加强对业务模型的审核。尤其是评估业务模型变化对软件设计的影响。

    4.4 进度估算

    同样的,进度估算同样可以以业务模型为基础进行。因为业务模型的粒度适中,所以进度的分配和统计相对比较容易进行。

    参考资料

    Design Patterns: Elements of Reusable Object-Oriented Software. Gamma, E. Helm, R. Johnson and J. Vlissides Addison-Wesley 1995. 中文版:《设计模式:可复用面向对象软件的基础》,李英军等译,机械工业出版社2000 年9 月。

    J2EE核心模式 Deepak Alur, John Crupi, Dan Malks 牛志奇等译,机械工业出版社。

    Effective Java Programming Language Guide. Joshua Bloch 2002 中文版:《Effective Java》潘爱民译,机械工业出版社2003年1月。

    [Kel+96b] Wolfgang Keller, Jens Coldewey: Relational Database Access Layers: A Pattern Language, Proceedings PLoP '96, Allerton Park 1996.

    [BMR+96] Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal: Pattern-Oriented Software Architecture - A System of Patterns; John Wiley & Sons Ltd., Chichester, England, 1996; ISBN 0-471-95869-7

    [Fow97] Martin Fowler: Analysis Patterns- Reusable Object Models; Addison-Wesley Publishing Company, Reading, Massachusetts , 1997; ISBN 0-201-89542-0

    [Fowler, roles] Fowler, Martin. Dealing with Roles, http://www.awl.com/cseng/titles/0-201-89542-0/awweb.htm

    [Fer00b] E. B. Fernandez and X. Yuan. "Analysis patterns for the order and shipment of a product", Procs. of PloP 2000. http://jerry.cs.uiuc.edu/~plop/plop2k

    [Fer00c] E. B. Fernandez. "Stock Manager: an analysis pattern for inventories", Procs. Of PloP 2000. http://jerry.cs.uiuc.edu/~plop/plop2k

    Refactoring To Patterns Joshua Kerievsky 2002

    关于作者

    林星,辰讯软件工作室项目管理组资深项目经理,有多年项目实施经验。辰讯软件工作室致力于先进软件思想、软件技术的应用,主要的研究方向在于软件过程思想、Linux集群技术、OO技术和软件工厂模式。您可以通过电子邮件 iamlinx@21cn.com 和他联系。

    展开全文
  • 我假设你HashMap感兴趣,另外我认为你已经了解了HashMap基础,这里我不再赘述HashMap什么东东,如果对于你来讲HashMap还是一个新概念的话,你可以去看看官方javadoc. 如果任何人让我描述一下HashMap...
  • 可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程心得和经验,写一篇比较全面介绍文章。首先有两点需要肯定:  第一:XML肯定未来...
  • 学生还可以通过一些高级编程概念(如接口、抽象和封装)了解,为进一步深入学习高级编程知识打下坚实基础。本书观点清晰明了、语言风格鲜明独特,深入浅出地介绍了一些高级主题。 本书特色: ◆介绍了多个库包...
  • 9、下列有关数据库的描述正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是...
  • 第二章题.docx

    2020-08-08 21:01:14
    5 关于执行命令“docker ps -a”后,显示的标题含义描述正确的是? (A B C D) A. CONTAINER ID: 容器的唯一表示ID B. IMAGE: 创建容器时使用的镜像 C. COMMAND: 容器最后运行的命令 D. CREATED: 创建容器的...
  • 理解三色标记法关键理解对象的三色抽象以及波面(wavefront)推进这两个概念。三色抽象只是一种描述追踪式回收器方法,在实践中并没有实际含义,它重要作用在于从逻辑上严密推导标记清理这种垃圾回收方法...

    df74b8869900b139984255daba26f728.gif

    上一篇文章已经对 Go语言中的 GC 有了初步的介绍。本节将继续深入介绍 Go语言中的GC

    什么是三色标记法?

    理解三色标记法的关键是理解对象的三色抽象以及波面(wavefront)推进这两个概念。三色抽象只是一种描述追踪式回收器的方法,在实践中并没有实际含义,它的重要作用在于从逻辑上严密推导标记清理这种垃圾回收方法的正确性。也就是说,当我们谈及三色标记法时,通常指标记清扫的垃圾回收。

    从垃圾回收器的视角来看,三色抽象规定了三种不同类型的对象,并用不同的颜色相称:

    • 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。

    • 灰色对象(波面):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。

    • 黑色对象(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

    这样三种不变性所定义的回收过程其实是一个波面不断前进的过程,这个波面同时也是黑色对象和白色对象的边界,灰色对象就是这个波面。

    当垃圾回收开始时,只有白色对象。随着标记过程开始进行时,灰色对象开始出现(着色),这时候波面便开始扩大。当一个对象的所有子节点均完成扫描时,会被着色为黑色。当整个堆遍历完成时,只剩下黑色和白色对象,这时的黑色对象为可达对象,即存活;而白色对象为不可达对象,即死亡。这个过程可以视为以灰色对象为波面,将黑色对象和白色对象分离,使波面不断向前推进,直到所有可达的灰色对象都变为黑色对象为止的过程。如下图所示:

    c500745a773143a55f6cc4d9b38d21f8.png

    图中展示了根对象、可达对象、不可达对象,黑、灰、白对象以及波面之间的关系。

    什么是STW?

    STW 可以是 Stop the World 的缩写,也可以是 Start the World 的缩写。通常意义上指指代从 Stop the World 这一动作发生时到 Start the World 这一动作发生时这一段时间间隔,即万物静止。STW 在垃圾回收过程中为了保证实现的正确性、防止无止境的内存增长等问题而不可避免的需要停止赋值器进一步操作对象图的一段过程。

    在这个过程中整个用户代码被停止或者放缓执行, STW 越长,对用户代码造成的影响(例如延迟)就越大,早期 Go 对垃圾回收器的实现中 STW 长达几百毫秒,对时间敏感的实时通信等应用程序会造成巨大的影响。我们来看一个例子:

    package mainimport (    "runtime"    "time")func main() {    go func() {        for {        }    }()    time.Sleep(time.Millisecond)    runtime.GC()    println("OK")}

    上面的这个程序在 Go 1.14 以前永远都不会输出 OK,其罪魁祸首是进入 STW 这一操作的执行无限制的被延长。

    尽管 STW 如今已经优化到了半毫秒级别以下,但这个程序被卡死原因是由于需要进入 STW 导致的。原因在于,GC 在需要进入 STW 时,需要通知并让所有的用户态代码停止,但是 for {} 所在的 goroutine 永远都不会被中断,从而始终无法进入 STW 阶段。实际实践中也是如此,当程序的某个 goroutine 长时间得不到停止,强行拖慢进入 STW 的时机,这种情况下造成的影响(卡死)是非常可怕的。好在自 Go 1.14 之后,这类 goroutine 能够被异步地抢占,从而使得进入 STW 的时间不会超过抢占信号触发的周期,程序也不会因为仅仅等待一个 goroutine 的停止而停顿在进入 STW 之前的操作上。

    以上是关于Go语言 GC中三色标记法和STW 的介绍,后续将继续介绍Go语言中的GC-如何观察GC和解析内存占用情况。

    感谢您的阅读,如有疑问或意见请及时反馈给我们。


    推荐文章:

    Go语言中的GC(垃圾回收)

    展开全文
  • 1.什么是线程安全线程安全性定义中最核心的是概念正确性。 正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。 在正确...
    

    编写线程安全的代码的核心是要对状态访问操作进行管理,尤其是对共享的和可变的状态访问。
    这里的对象的状态可以看成是存储在状态变量(例如实例或静态域)中的数据。

    1.什么是线程安全

    线程安全性定义中最核心的是概念是正确性。
    正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。
    在正确性定义的基础上,线程安全性的定义:当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类是线程安全的。
    当多个线程访问某个类时, 不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
    在线程安全的类中封装了必要的同步机制,因此客户端无需采取进一步同步措施。
    完全由线程安全类构成的程序并不一定就是线程安全的, 而在线程安全的类中也可能包含有非线程安全的类。
    无状态对象一定是线程安全的
    对于无状态对象(既不包含任何与又不包含对其他类中域的引用),计算过程中的临时状态仅存在线程栈上的临时变量中,并且只能由正在执行的线程访问,两个不同线程不会彼此影响,因为这两个线程没有共享状态。

    2.原子性

    具有原子性的操作被称为原子操作。原子操作在操作完毕之前不会线程调度器中断。在Java中,对除了long和double之外的基本类型的简单操作都具有原子性。简单操作就是赋值或者return。比如”a = 1;“和 “return a;”这样的操作都具有原子性。但是在Java中,上面买碘片例子中的类似”a += b”这样的操作不具有原子性,所以如果add方法不是同步的就会出现难以预料的结果。在某些JVM中”a += b”可能要经过这样三个步骤:

    1) 读取:取出a和b
    2) 修改:计算a+b
    3) 写入:将计算结果写入内存

    如果有两个线程t1,t2在进行这样的操作。t1在第二步做完之后还没来得及把数据写回内存就被线程调度器中断了,于是t2开始执行,t2执行完毕后t1又把没有完成的第三步做完。这个时候就出现了错误,相当于t2的计算结果被无视掉了。类似的,像”a++“这样的操作也都不具有原子性。
    非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

    这里引入一个概念:竞态条件,指的是在并发编程中,由于不恰当的执行时序而出现不正确的结果的情况。
    当某个计算结果的正确性取决于多个线程的交替执行时序时就会发生竞态条件。
    常见的两种竞态条件是:“先检查后执行”和 “读取-修改-写入

    使用“先检查后执行”的常见情况就是延迟初始化,即将对象的初始化延迟到实际使用的时候再进行:

    ...
    if(instance == null)
        instance = new object();
    ...

    为了保证线程安全,在出现竞态条件的代码需要以原子方式执行,确保其他线程只能在本线程的本次操作完成之前或者之后修改状态,而不是在本线程的此次操作过程中。

    3.加锁机制

    内置锁
    Java提供了一种内置锁机制来支持原子性:同步代码块。同步代码块包括两个部分:一个是作为锁的对象引用,一个是作为由这个锁保护的代码块。每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁。

    重入
    当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会被阻塞,然而内置锁是可以重入的。因此如果某个线程试图获得一个已经有它自己持有的锁,那么这个请求就会成功。
    重入意味着获取锁的操作的粒度是“线程”,而不是“调用”。
    注意,“锁”的持有者是实例对象!对象!对象!而不是类!

    4.用锁来保护状态

    由于锁能使其保护的代码路径以串行的方式来访问,因此可以通过锁来构造一些协议以实现对共享对象的独占访问。只要遵循这些协议就能确保状态的一致性。
    并不是只有在写入共享变量时才需要使用同步。对于可能被多个线程同事访问的可变状态变量,在访问它时都需要持有同一个锁,这种情况下我称这个状态变量时由这个锁保护的。
    对于每个包含多个变量的不变性条件, 其中涉及的所有变量都需要由同一个锁保护。

    虽然通过枷锁可以 保证单个操作的原子性,但如果多个操作合并为一个复合操作还需要额外的加锁机制。此外将每个方法都作为同步方法还可能导致活跃性问题或者性能问题。
    为了确保程序的并发性,我们需要缩小同步代码块的作用范围。当执行时间较长的计算或者可能无法快速完成的操作时(例如, 网络I/O或者控制台I/O),一定不要加锁。



    展开全文
  • 1.什么是线程安全线程安全性定义中最核心的是概念正确性。 正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。 在...
  • 面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护接口访问其他对象。 4. 多态性:  多态性指允许不同类的对象对同一消息作出响应。多态性包括参数化...
  • 不幸的是,虽然关系型数据库历经了约30年的发展,有成熟的理论和大量的实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务的需要和编程的方便,把字段这张表放几个那张表放几个...
  • 业务建模

    2021-02-04 10:17:06
    这个描述将会直接指导最终生成的软件,业务模型是否具有扩展性,业务模型是否能够正确的反映需求,都将影响最终软件的质量。1.业务建模1.1为什么要业务建模?我们把业务建模这个概念放在了最后的部分,因为面向对象...
  • 它的功能是什么? 做正确的事 设计: 强调满足需求的概念性解决方案(在软件和硬件中),而不是它的实现。例如,数据库模式和软件对象描述。 把事情做 用一句话描述面向对象的分析与设计的优势。 面向对象...
  • 主要研究方向数据库系统、时间数据库、概念建模、面向对象数据库、Wed建模和本体论数据库模型和语言、DBMS系统实现、检索技术等。  Shamkant B.Navathe 世界知名数据库学者。现任佐治亚理工学院计算学院...
  • exande r所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向 对象的解决方案里,我们用对象和接口代替了墙壁和门窗。两类模式的核心都在于提供了相关问题 的解决方案。 一般而言,一个...
  • 人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道代码隔离开来,而Trygve Reenskaug在跟一些人讨论中,逐渐剥离出一系列的概念,最初Thing、Model、View、Editor。后来经过讨论定为...
  • 例如:数据库查询条件传入问题所有ORM框架都不能回避一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样方法来描述一个不以主键为条件update/select/...
  • 5.3 设置正确的参数 136 5.3.1 查询优化器参数 137 5.3.2 pga管理 150 5.4 小结 153 第6章 执行计划 154 6.1 获取执行计划 154 6.1.1 sql语句explain plan 154 6.1.2 动态性能视图 157 6.1.3 awr...
  • 下列属于面向对象开发方法的是(A B C D)。 A) Booch B) UML C) Coad D) OMT 6. 软件危机的主要表现是(B D)。 A) 软件成本太高 B) 软件产品的质量低劣 C) 软件开发人员明显不足 D) 软件生产率低下 7...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    问:开发这个软件目标是什么? 答: 提高用户音乐学习和娱乐 参与创作音乐 项目背景--钢琴练奏师 问:为什么传统音乐程序不好? 答: 传统音乐程序功能单一,容易令人感到枯燥无味,没有吸引力; 传统音乐...
  • 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说可见(公有部 分),而某些部分却隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放时发挥作 用。在本...
  • 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说可见(公有部 分),而某些部分却隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放时发挥作 用。在本...
  • 需求分析-业务建模

    2009-07-27 16:14:00
    IBM 面向对象软件开发和过程中这样描述业务建模 业务建模OOAD重要组成部分,简单说,业务建模就业务领域问题进行结构化的描述。这个描述将会直接指导最终生成软件,业务模型是否具有扩展性,业务模型...
  • 储在对象中信息以及可对对象执行操作(类方法)。对象某些组成部分对于外界来说可见(公有部 分),而某些部分却隐藏(私有部分)。特殊类方法(构造函数和析构函数)在对象创建和释放时发挥作 用。在本...

空空如也

空空如也

1 2 3 4 5 6
收藏数 111
精华内容 44
关键字:

对对象概念描述正确的是什么