资源描述:
《Java Monitor Pattern设计模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JavaMonitorPattern本文从典型的MonitorObject设计模式入手,从一个新的视角,来探讨Java语言的同步机制.本文将从两个方面进行阐述:1、使用C语言来描述MonitorObject设计模式.Java对于这样一个典型的模式做了很好的语言层面的封装,因此对于Java的开发者来说,很多关于该模式本身的东西被屏蔽掉了.本文试图使用NativeC语言,帮助读者从本质上对Monitorobject设计模式有一个更全面的认识.2、结合C版本的MonitorObject设计模式,引领读者对于Java同步机制有一个更深刻的认识,帮助读者正确
2、有效地使用Java同步机制.预备知识在开始正式讨论之前,需要了解一些预备知识.什么是RAII资源获取即初始化(RAII,ResourceAcquisitionIsInitialization)是指,在一个对象的构造函数中获得资源,并且在该对象的析构函数中释放它.这个资源可以是对象、内存、文件句柄或者其它类型.实现这种功能的类,我们就说它采用了资源获取即初始化(RAII)的方式.RAII是一种很典型的语言惯用法,被很多的OO语言所使用,下面是C的例子.清单1.RAIIUsingCclassRaii{public://Storeapointertoth
3、eresourceandinitializetheresource.Raii(Resource&resource):m_pRes(&resource){m_pRes->initialize();}//Closetheresourcewhentheexecutiongoesoutofscope.virtual~Raii(){m_pRes->close();}private://Pointertotheresourcewe'remanaging.Resource*m_pRes;//...maybeneeddisallowcopyingandassign
4、ment...};使用RAII的好处是:析构函数由系统自动调用,这样可以帮助我们自动地隐式释放我们所获取的资源.事情上,我们熟知的很多C技术都用到了这一设计模式,比如:智能指针(SmartPointer),以及我们接下来要讨论的范围锁(ScopedLock).不同于C,Java对象没有析构函数,JavaSystem提供了GC来管理内存资源.而对于像数据库连接,Sockets这样类型的资源,Java提供了finalize()来处理.但是,请注意,Java的finalizer与C的析构函数是不同的,finalize()函数由GC异步地在某个恰当的时候调
5、用,我们不能等同地使用finalize()来实现C里的RAII.通常的做法是使用Java提供的finally语句块.清单2.RAIIUsingJavaMyResourceres=null;try{res=newMyResource();//Usetheresource}finally{//Atexitpoint,closetheresource.if(res!=null){res.close();}}什么是区域锁(ScopedLock)区域锁是指线程执行进入一个区域时,一个锁将自动被获取,当该线程执行离开这个区域时,这个锁将被自动释放.C区域锁的实
6、现使用了RAII技术,实现如下.清单3.ScopedLockUsingCtemplateclassGuard{public://Storeapointertothelockandacquirethelock.Guard(LOCK&lock):m_pLlock(&lock),m_bOwner(false){m_pLlock->acquire();m_bOwner=true;}//Releasethelockwhentheguardgoesoutofscope,//butonlyifsucceeded.virtu
7、al~Guard(){if(m_bOwner)m_pLlock->release();}private://Pointertothelockwe'remanaging.LOCK*m_pLlock;//Recordsifthelockisheldbythisobject.boolm_bOwner;//...maybeneeddisallowcopyingandassignment...};Guard是一个模板类,LOCK类型指的是对操作系统提供的线程锁的抽象,比如,在Windows平台上,LOCK可以是对CRITICAL_SECTION的封装.Jav
8、a对于区域锁模式在语言层面上已经做了封装,所以对于Java开发者来说,不必像C这样来开发自己的区域锁类,这就是我们所熟知的