快速业务通道

探索Java同步机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

探索Java同步机制

时间:2011-07-08 IBM 李三红

本文将从两个方面进行阐述:

使用 C++ 语言来描述 Monitor Object 设计模式。Java 对于这样一个典型的 模式做了很好的语言层面的封装,因此对于 Java 的开发者来说,很多关于该模 式本身的东西被屏蔽掉了。本文试图使用 Native C++ 语言,帮助读者从本质上 对 Monitor object 设计模式有一个更全面的认识。

结合 C++ 版本的 Monitor Object 设计模式,引领读者对于 Java 同步机制 有一个更深刻的认识,帮助读者正确有效地使用 Java 同步机制。

预备知识

在开始正式讨论之前,需要了解一些预备知识。

什么是 RAII

资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指 ,在一个对象的构造函数中获得资源 , 并且在该对象的析构函数中释放它。这个 资源可以是对象、内存、文件句柄或者其它类型。实现这种功能的类,我们就说 它采用了资源获取即初始化(RAII)的方式。 RAII 是一种很典型的语言惯用法 ,被很多的 OO 语言所使用,下面是 C++ 的例子。

清单 1. RAII Using C++

class Raii { public:    // Store a pointer to the resource and initialize the resource.    Raii(Resource &resource)    :m_pRes (&resource){      m_pRes->initialize ();    }    // Close the resource when the execution goes out of scope.    virtual ~Raii() {      m_pRes->close ();    } private:    // Pointer to the resource we''re managing.    Resource *m_pRes;    // ... maybe need disallow copying and assignment ... };

使用 RAII 的好处是:由于析构函数由系统自动调用,这样可以帮助我们自动 地隐式释放我们所获取的资源。事情上,我们熟知的很多 c++ 技术都用到了这一 设计模式,比如:智能指针 (Smart Pointer),以及我们接下来要讨论的范围锁 (Scoped Lock) 。

不同于 C++,Java 对象没有析构函数,Java System 提供了 GC 来管理内存 资源。而对于像数据库连接,Sockets 这样类型的资源, Java 提供了 finalize() 来处理。但是,请注意,Java 的 finalizer 与 C++ 的析构函数是 不同的,finalize() 函数由 GC 异步地在某个恰当的时候调用,我们不能等同地 使用 finalize() 来实现 C++ 里的 RAII 。通常的做法是使用 Java 提供的 finally 语句块。

清单 2. RAII Using Java

MyResource res = null; try {    res = new MyResource();    // Use the resource } finally {    //At exit point, close the resource.    if (res != null) { res.close(); } }

探索Java同步机制(2)

时间:2011-07-08 IBM 李三红

什么是区域锁 (Scoped Lock)

区域锁是指线程执行进入一个区域时,一个锁将自动被获取,当该线程执行离 开这个区域时,这个锁将被自动释放。 C++ 区域锁的实现使用了 RAII 技术 , 实现如下。

清单 3. Scoped Lock Using C++

template <class LOCK> class Guard { public:    // Store a pointer to the lock and acquire the lock.    Guard (LOCK &lock)    :m_pLlock (&lock), m_bOwner (false) {      m_pLlock->acquire ();      m_bOwner = true;    }    // Release the lock when the guard goes out of scope,    // but only if <acquire> succeeded.    virtual ~Guard () {      if (m_bOwner) m_pLlock->release ();    } private:    // Pointer to the lock we''re managing.    LOCK *m_pLlock;    // Records if the lock is held by this object.    bool m_bOwner;    // ...

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号