并发对象可分为:
顺序对象(sequential objects):对象以FIFO的结构顺序地从 消息队列中选择满足条件的消息进行处理,这时,对象中只有一个 执行线程. 伪并发对象(quasi-concurrent objects):对象中存在多个执行 线程,但在某一时刻只有一个是活动的.如管程(monitor)对象,除 了一个线程可以执行外,其它线程都因调用条件变量上的wait而被 挂起. 并发对象(concurrent objects):对象中同时存在多个活动线 程,一个线程只有在需要等待使用对象的局部变量(由对象的多个 线程共享)或其它条件时,才被挂起.
2 并发执行
1) 异步消息发送 如果消息发送者在发送消息后不需消息处理结果,或者不立即需要 处理结果,消息发送者不必等待消息接受者接收和处理消息即可继续执 行下去,只有在消息发送者需要消息的处理结果时才等待.消息接受者 对消息进行缓存,在适当的时候处理之.采用异步消息发送需要解决的 两个问题是: (1)消息处理者如何返回处理结果 (2)消息发送者如何得到处理结果 对于问题(1)的一般解决方案是:在消息中带有发送者的地址(标 识),消息处理者在处理完某消息后,将根据消息中的发送者标识给其 发回返回值消息.关于问题(2)的一种解决方案是把对象的消息分成两 类:一类是普通消息,另一类是回答(返回值)消息.这样往往要把一个 完整的消息处理过程分成若干个子过程,其中一个用于处理普通消息, 其它的用于处理返回值消息,从而给程序设计带来麻烦. 另一种解决问题(2)的途径是:对象发送消息时,消息中带的不是发 送者的地址,而是另一个对象(发送者的代理)的地址,这个代理对象在 消息发送时创建,消息处理结果将送给这个对象,当消息发送者需要消 息的处理结果时,将向这个对象发送消息以获得消息处理结果,这时采 用同步消息发送. 有时还要求一个对象以同样的次序处理从同一个对象发送来的两 条消息. 2) 主动对象 在面向对象模型中引进并发的另一种途径是给对象加一个自己的执 行线程,这个执行线程常被称为对象的体,有对象体的对象被称为主动 对象.当主动对象创建时,它的体就立即作为单独的线程开始执行.在 对象体执行的同时,对象还可以接收和发送消息.
在采用异步消息传递机制的并发面向对象模型中,系统的并发是由 异步消息发送产生,而在基于主动对象的并发面向对象模型中,系统的 并发则是由创建新对象产生的. 两种模型在描述系统的并发程度上是不同,前者属于一种细粒度 (fine-grained)控制,并发程度较高,后者是一种粗粒度(coarse-grained) 并发控制,系统的并发程度相对较低.当然,在主动对象模型中也可以 采用异步消息传递,从而提高系统的并发度,不过对于并发系统而言, 并发度是一个要考虑的问题,另一个需要考虑的问题是系统的可靠性, 异步消息传递使得系统的行为难以控制,不利于对程序的理解.
10.3 并发控制 在并发面向对象程序设计中存在共享对象.共享的对象将会面临环 境对其方法的并发调用,如果对方法的并发调用不进行同步(并发控 制),将会造成对象行为的不正确. 并发控制可以由发送消息的对象完成,也可以由接收消息的对象来 实现.从对象的自治性角度来说,并发控制应由接收消息的对象来进行, 这样做比较安全. 1,集中控制和分散控制 集中控制是指把对象的同步控制作为一个整体进行描述,对象接受 消息时根据这个描述来决定是否处理某个消息,如:给对象设置一个路 径表达式或用主动对象的对象体来控制;分散控制是指把控制分散到对 象的各个方法上,对象接收到一个消息时由相应方法决定是否处理之, 如:给对象的每个方法设置一个执行条件或在方法中用代码实现. 2,隐式控制和显式控制 在隐式控制方式中,对象(类)只给出同步限制的抽象描述,具体代 码由编译系统产生,如:路径表达式或方法的执行条件.在显式控制方 式中,由程序设计者给出具体的同步代码,如:对象体或方法代码.
3,混合控制 把1和2结合起来. 对象的条件同步控制与互斥控制 一个对象的并发控制可分成两类:条件同步控制和互斥控制.对象 的条件同步控制是指对象在某种状态下只能接收某一些消息,如:对于 有界缓存(Bounded Buffer)对象:当缓存为空时,只能接收put消息而 不能接收get消息;缓存满时,只能接收get消息而不能接收put消息. 对象的互斥控制是指:当处于某种状态下的对象可以接收(处理)多个消 息,如:缓存不空又不满,这时,既能接收get消息又能接收put消息, 由于这些消息的处理都有可能使用对象的局部变量,如果让它们同时执 行,就存在共享变量(对象的局部变量)问题,为了保证对象状态的完整 性和一致性,这些方法必须互斥地使用对象的局部变量,否则将造成对 象状态的混乱. 易造成继承异常的是条件同步控制,分散的隐式控制有利于控制继 承异常现象. |