




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Monitor Object设计模式入手 探索Java同步机制 二,Monitor Object 设计模式 C+ 描述 我们将从以下几个方面来讨论 Monitor Object 模式。 问题描述 我们在开发并发的应用时,经常需要设计这样的对象,该对象的方法会在多线程的环境下被调用,而这些方法的执行都会改变该对象本身的状态。为了防止竞争条件 (race condition) 的出现,对于这类对象的设计,需要考虑解决以下问题: 在任一时间内,只有唯一的公共的成员方法,被唯一的线程所执行。 对于对象的调用者来说,如果总是需要在调用方法之前进行拿锁,而在调用方法之后进行放锁,这将会使并发应用编程变得更加困难。合理的设计是,该对象本身确保任何针对它的方法请求的同步被透明的进行,而不需要调用者的介入。,如果一个对象的方法执行过程中,由于某些条件不能满足而阻塞,应该允许其它的客户端线程的方法调用可以访问该对象。 我们使用 Monitor Object 设计模式来解决这类问题:将被客户线程并发访问的对象定义为一个 monitor 对象。客户线程仅仅通过 monitor 对象的同步方法才能使用 monitor 对象定义的服务。为了防止陷入竞争条件,在任一时刻只能有一个同步方法被执行。每一个 monitor 对象包含一个 monitor 锁,被同步方法用于串行访问对象的行为和状态。此外,同步方法可以根据一个或多个与 monitor 对象相关的 monitor conditions 来决定在何种情况下挂起或恢复他们的执行。,结构 在 Monitor Object 模式中,主要有四种类型的参与者: 监视者对象 (Monitor Object): 负责定义公共的接口方法,这些公共的接口方法会在多线程的环境下被调用执行。 同步方法:这些方法是监视者对象所定义。为了防止竞争条件,无论是否同时有多个线程并发调用同步方法,还是监视者对象含有多个同步方法,在任一时间内只有监视者对象的一个同步方法能够被执行。 监视锁 (Monitor Lock): 每一个监视者对象都会拥有一把监视锁。 监视条件 (Monitor Condition): 同步方法使用监视锁和监视条件来决定方法是否需要阻塞或重新执行。,执行序列图 在监视者对象模式中,在参与者之间将发生如下的协作过程: 1、同步方法的调用和串行化。当客户线程调用监视者对象的同步方法时,必须首先获取它的监视锁。只要该监视者对象有其他同步方法正在被执行,获取操作便不会成功。在这种情况下,客户线程将被阻塞直到它获取监视锁。当客户线程成功获取监视锁后,进入临界区,执行方法实现的服务。一旦同步方法完成执行,监视锁会被自动释放,目的是使其他客户线程有机会调用执行该监视者对象的同步方法。 2、同步方法线程挂起。如果调用同步方法的客户线程必须被阻塞或是有其他原因不能立刻进行,它能够在一个监视条件上等待,这将导致该客户线程暂时释放监视锁,并被挂起在监视条件上。,3、监视条件通知。一个客户线程能够通知一个监视条件,目的是为了让一个前期使自己挂起在一个监视条件上的同步方法线程恢复运行。 4、同步方法线程恢复。一旦一个早先被挂起在监视条件上的同步方法线程获取通知,它将继续在最初的等待监视条件的点上执行。在被通知线程被允许恢复执行同步方法之前,监视锁将自动被获取。图 1 描述了监视者对象的动态特性。,示例 在本节中,我们将使用监视者对象设计模式来解决一个实际的问题。 这是一个典型的生产者 / 消费者模式问题。假定我们有一个固定长度的消息队列,该队列会被多个生产者 / 消费者线程所操作,生产者线程负责将消息放入该队列,而消费者线程负责从该对列中取出消息。 清单 6. Message_Queue.h class Message_Queue public: enum MAX_MESSAGES = 100/* . */ ; / The constructor defines the maximum number / of messages in the queue. This determines when the queue is full. Message_Queue(size_t max_messages = MAX_MESSAGES); virtual Message_Queue();,/ Put the at the tail of the queue. / If the queue is full, block until the queue is not full. /* synchronized */ void put (const Message ,private: / Put the at the tail of the queue, and / get the at its head, respectively. / Note that, the internal methods are not synchronized. void put_i (const Message ,/ The maximum number s that can be / in a queue before its considered full. size_t max_messages_; / Monitor lock that protects the queues / internal state from race conditions during concurrent access. mutable Thread_Mutex monitor_lock_; / Condition variable used in conjunction with to make / synchronized method threads wait until the queue is no longer empty. Thread_Condition not_empty_; / Condition variable used in conjunction with to make / synchronized method threads wait until the queue is no longer full. Thread_Condition not_full_; ;,清单 7. Message_Queue.cpp #include “Message_Queue.h“ Message_Queue:Message_Queue (size_t max_messages) :not_full_(monitor_lock_), not_empty_(monitor_lock_), max_messages_(max_messages), message_count_(0) bool Message_Queue:empty () const Guard guard (monitor_lock_); return empty_i (); bool Message_Queue:full () const,Guard guard (monitor_lock_); return full_i (); void Message_Queue:put (const Message ,/ Enqueue the at the tail. put_i (msg); / Notify any thread waiting in that the queue has at least one . not_empty_.notify (); / Destructor of releases . Message Message_Queue:get () / Use the Scoped Locking idiom to acquire/release the upon / entry/exit to the synchronized method. Guard guard (monitor_lock_); / Wait while the queue is empty. while (empty_i () / Release and suspend the / calling thread waiting for a new to / be put into the queue. The is / reacquired automatically when returns. not_empty_.wait (); ,/ Dequeue the first in the queue and update the . Message m = get_i (); / Notify any thread waiting in that the / queue has room for at least one . not_full_.notify (); return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 办公网络安全维护与保障合同
- 音乐记忆的叙事结构分析-洞察及研究
- 金融科技营销策略-洞察及研究
- 外包软件开发委托合同协议
- 绿色能源项目投资合同书
- 餐饮代运营服务合同范本
- 家庭农场农产品品牌合作开发合同
- 餐饮股东入股协议书合同
- 退化草原恢复机制-洞察及研究
- 零信任过滤体系-洞察及研究
- 美陈施工组织方案
- 腹腔镜CO2气腹并发症的预防与处理
- 中国阅兵仪式课件
- 2026年高考语文备考之必背补充教材篇目(原文+注释+翻译)
- 药剂科集采政策
- 中医情志护理方法
- 民营医院成本管理办法
- 杭州银行薪资管理办法
- 教堂定期活动方案
- 福建省2025年中考物理真题及答案
- GB/T 2820.5-2025往复式内燃机驱动的交流发电机组第5部分:发电机组
评论
0/150
提交评论