MonitorObject设计模式入手探索Java同步机制二.ppt

上传人:tia****nde 文档编号:11497279 上传时间:2020-04-25 格式:PPT 页数:13 大小:379KB
返回 下载 相关 举报
MonitorObject设计模式入手探索Java同步机制二.ppt_第1页
第1页 / 共13页
MonitorObject设计模式入手探索Java同步机制二.ppt_第2页
第2页 / 共13页
MonitorObject设计模式入手探索Java同步机制二.ppt_第3页
第3页 / 共13页
点击查看更多>>
资源描述
MonitorObject设计模式入手探索Java同步机制二,MonitorObject设计模式C+描述我们将从以下几个方面来讨论MonitorObject模式。问题描述我们在开发并发的应用时,经常需要设计这样的对象,该对象的方法会在多线程的环境下被调用,而这些方法的执行都会改变该对象本身的状态。为了防止竞争条件(racecondition)的出现,对于这类对象的设计,需要考虑解决以下问题:在任一时间内,只有唯一的公共的成员方法,被唯一的线程所执行。对于对象的调用者来说,如果总是需要在调用方法之前进行拿锁,而在调用方法之后进行放锁,这将会使并发应用编程变得更加困难。合理的设计是,该对象本身确保任何针对它的方法请求的同步被透明的进行,而不需要调用者的介入。,如果一个对象的方法执行过程中,由于某些条件不能满足而阻塞,应该允许其它的客户端线程的方法调用可以访问该对象。我们使用MonitorObject设计模式来解决这类问题:将被客户线程并发访问的对象定义为一个monitor对象。客户线程仅仅通过monitor对象的同步方法才能使用monitor对象定义的服务。为了防止陷入竞争条件,在任一时刻只能有一个同步方法被执行。每一个monitor对象包含一个monitor锁,被同步方法用于串行访问对象的行为和状态。此外,同步方法可以根据一个或多个与monitor对象相关的monitorconditions来决定在何种情况下挂起或恢复他们的执行。,结构在MonitorObject模式中,主要有四种类型的参与者:监视者对象(MonitorObject):负责定义公共的接口方法,这些公共的接口方法会在多线程的环境下被调用执行。同步方法:这些方法是监视者对象所定义。为了防止竞争条件,无论是否同时有多个线程并发调用同步方法,还是监视者对象含有多个同步方法,在任一时间内只有监视者对象的一个同步方法能够被执行。监视锁(MonitorLock):每一个监视者对象都会拥有一把监视锁。监视条件(MonitorCondition):同步方法使用监视锁和监视条件来决定方法是否需要阻塞或重新执行。,执行序列图在监视者对象模式中,在参与者之间将发生如下的协作过程:1、同步方法的调用和串行化。当客户线程调用监视者对象的同步方法时,必须首先获取它的监视锁。只要该监视者对象有其他同步方法正在被执行,获取操作便不会成功。在这种情况下,客户线程将被阻塞直到它获取监视锁。当客户线程成功获取监视锁后,进入临界区,执行方法实现的服务。一旦同步方法完成执行,监视锁会被自动释放,目的是使其他客户线程有机会调用执行该监视者对象的同步方法。2、同步方法线程挂起。如果调用同步方法的客户线程必须被阻塞或是有其他原因不能立刻进行,它能够在一个监视条件上等待,这将导致该客户线程暂时释放监视锁,并被挂起在监视条件上。,3、监视条件通知。一个客户线程能够通知一个监视条件,目的是为了让一个前期使自己挂起在一个监视条件上的同步方法线程恢复运行。4、同步方法线程恢复。一旦一个早先被挂起在监视条件上的同步方法线程获取通知,它将继续在最初的等待监视条件的点上执行。在被通知线程被允许恢复执行同步方法之前,监视锁将自动被获取。图1描述了监视者对象的动态特性。,示例在本节中,我们将使用监视者对象设计模式来解决一个实际的问题。这是一个典型的生产者/消费者模式问题。假定我们有一个固定长度的消息队列,该队列会被多个生产者/消费者线程所操作,生产者线程负责将消息放入该队列,而消费者线程负责从该对列中取出消息。清单6.Message_Queue.hclassMessage_Queuepublic:enumMAX_MESSAGES=100/*.*/;/Theconstructordefinesthemaximumnumber/ofmessagesinthequeue.Thisdetermineswhenthequeueisfull.Message_Queue(size_tmax_messages=MAX_MESSAGES);virtualMessage_Queue();,/Puttheatthetailofthequeue./Ifthequeueisfull,blockuntilthequeueisnotfull./*synchronized*/voidput(constMessage,private:/Puttheatthetailofthequeue,and/gettheatitshead,respectively./Notethat,theinternalmethodsarenotsynchronized.voidput_i(constMessage,/Themaximumnumbersthatcanbe/inaqueuebeforeitsconsideredfull.size_tmax_messages_;/Monitorlockthatprotectsthequeues/internalstatefromraceconditionsduringconcurrentaccess.mutableThread_Mutexmonitor_lock_;/Conditionvariableusedinconjunctionwithtomake/synchronizedmethodthreadswaituntilthequeueisnolongerempty.Thread_Conditionnot_empty_;/Conditionvariableusedinconjunctionwithtomake/synchronizedmethodthreadswaituntilthequeueisnolongerfull.Thread_Conditionnot_full_;,清单7.Message_Queue.cpp#includeMessage_Queue.hMessage_Queue:Message_Queue(size_tmax_messages):not_full_(monitor_lock_),not_empty_(monitor_lock_),max_messages_(max_messages),message_count_(0)boolMessage_Queue:empty()constGuardguard(monitor_lock_);returnempty_i();boolMessage_Queue:full()const,Guardguard(monitor_lock_);returnfull_i();voidMessage_Queue:put(constMessage,/Enqueuetheatthetail.put_i(msg);/Notifyanythreadwaitinginthatthequeuehasatleastone.not_empty_.notify();/Destructorofreleases.MessageMessage_Queue:get()/UsetheScopedLockingidiomtoacquire/releasetheupon/entry/exittothesynchronizedmethod.Guardguard(monitor_lock_);/Waitwhilethequeueisempty.while(empty_i()/Releaseandsuspendthe/callingthreadwaitingforanewto/beputintothequeue.Theis/reacquiredautomaticallywhenreturns.not_empty_.wait();,/Dequeuethefirstinthequeueandupdatethe.Messagem=get_i();/Notifyanythreadwaitinginthatthe/queuehasroomforatleastone.not_full_.notify();returnm;/Destructorofreleases.boolMessage_Queue:empty_i()constreturnmessage_count_=0;boolMessage_Queue:full_i()constreturnmessage_count_=max_messages_;Message_Queue:Message_Queue(),
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!