探索Java同步机制 - 编程入门网
为了防止竞 争条件 (race condition) 的出现,对于这类对象的设计,需要考虑解决以下问 题:
在任一时间内,只有唯一的公共的成员方法,被唯一的线程所执行。 对于对象的调用者来说,如果总是需要在调用方法之前进行拿锁,而在调用方 法之后进行放锁,这将会使并发应用编程变得更加困难。合理的设计是,该对象 本身确保任何针对它的方法请求的同步被透明的进行,而不需要调用者的介入。 如果一个对象的方法执行过程中,由于某些条件不能满足而阻塞,应该允许其 它的客户端线程的方法调用可以访问该对象。 我们使用 Monitor Object 设计模式来解决这类问题:将被客户线程并发访问 的对象定义为一个 monitor 对象。客户线程仅仅通过 monitor 对象的同步方法 才能使用 monitor 对象定义的服务。为了防止陷入竞争条件,在任一时刻只能有 一个同步方法被执行。每一个 monitor 对象包含一个 monitor 锁,被同步方法 用于串行访问对象的行为和状态。此外,同步方法可以根据一个或多个与 monitor 对象相关的 monitor conditions 来决定在何种情况下挂起或恢复他们 的执行。 探索Java同步机制(4)时间:2011-07-08 IBM 李三红结构 在 Monitor Object 模式中,主要有四种类型的参与者: 监视者对象 (Monitor Object): 负责定义公共的接口方法,这些公共的接口 方法会在多线程的环境下被调用执行。 同步方法:这些方法是监视者对象所定义。为了防止竞争条件,无论是否同时 有多个线程并发调用同步方法,还是监视者对象含有多个同步方法,在任一时间 内只有监视者对象的一个同步方法能够被执行。 监视锁 (Monitor Lock): 每一个监视者对象都会拥有一把监视锁。 监视条件 (Monitor Condition): 同步方法使用监视锁和监视条件来决定方法 是否需要阻塞或重新执行。 执行序列图 在监视者对象模式中,在参与者之间将发生如下的协作过程: 1、同步方法的调用和串行化。当客户线程调用监视者对象的同步方法时,必 须首先获取它的监视锁。只要该监视者对象有其他同步方法正在被执行,获取操 作便不会成功。在这种情况下,客户线程将被阻塞直到它获取监视锁。当客户线 程成功获取监视锁后,进入临界区,执行方法实现的服务。一旦同步方法完成执 行,监视锁会被自动释放,目的是使其他客户线程有机会调用执行该监视者对象 的同步方法。 2、同步方法线程挂起。如果调用同步方法的客户线程必须被阻塞或是有其他 原因不能立刻进行,它能够在一个监视条件上等待,这将导致该客户线程暂时释 放监视锁,并被挂起在监视条件上。 3、监视条件通知。一个客户线程能够通知一个监视条件,目的是为了让一个 前期使自己挂起在一个监视条件上的同步方法线程恢复运行。 4、同步方法线程恢复。一旦一个早先被挂起在监视条件上的同步方法线程获 取通知,它将继续在最初的等待监视条件的点上执行。在被通知线程被允许恢复 执行同步方法之前,监视锁将自动被获取。图 1 描述了监视者对象的动态特性。 图 1. Monitor Object Sequence Diagram. 探索Java同步机制(5)时间:2011-07-08 IBM 李三红示例 在本节中,我们将使用监视者对象设计模式来解决一个实际的问题。 这是一个典型的生产者 / 消费者模式问题。假定我们有一个固定长度的消息 队列,该队列会被多个生产者 / 消费者线程所操作,生产者线程负责将消息放入 该队列,而消费者线程负责从该对列中取出消息。 清单 6. Message_Queue.h
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |