Monitor.Wait方法和Monitor.Pulse方法

以下,小生愚见,如有误解,还请指教。

------------------------------------

在.NET线程管理队列中,分为

  等待队列:等待对象状态更改通知的线程。

  就绪队列:包含准备获取锁的线程。

Monitor.Wait方法(五个重载):

公共方法  Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。
公共方法  Wait(Object, Int32) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。
公共方法  Wait(Object, TimeSpan) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。
公共方法  Wait(Object, Int32, Boolean) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。此方法还指定是否在等待之前退出上下文的同步域(如果处于同步上下文中的话)然后重新获取该同步域。
公共方法  Wait(Object, TimeSpan, Boolean)

释放对象上的锁并阻止当前线程,直到它重新获取该锁。如果指定的超时间隔已过,则线程进入就绪队列。可以在等待之前退出同步上下文的同步域,随后重新获取该域。

参数:

Object obj:要在其上等待的对象。 一般与Monitor.enter(obj)中的参数对象相同。

int/TimeSpan timeOut:线程进入就绪队列之前等待的毫秒数。如果指定的超时间隔已过,则线程进入就绪队列。

返回值:

bool : 如果在指定的时间过期之前重新获取该锁,则为 true;如果在指定的时间过期之后重新获取该锁,则为 false。 此方法只有在重新获取该锁后才会返回。

Monitor.Pulse方法:

public static void Pulse(Object obj)

参数: Object obj:线程正在等待的对象。一般与Monitor.wait(obj)中的参数相同。

--------------------------------------------------------------------------------------------------------

wait()只有在重新获取 obj 参数的独占锁后,此方法才会返回。

当前拥有指定对象上的锁的线程调用wait()方法以释放该对象,以便其他线程可以访问它。调用方在等待重新获取锁期间被阻止。当调用方需要等待另一个线程操作导致的状态更改时,将调用此方法。

如果另一个线程未先调用 PulsePulseAll 方法就释放锁,超时(timeOut参数)可以确保当前线程不会无限期阻止。

当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用。调用 Wait 的线程保留在等待队列中,直到拥有锁的线程调用 PulseAll,或者直到它是队列中的下一个线程并且拥有锁的线程调用 Pulse。 但是,如果在另一个线程调用此对象的 PulsePulseAll 方法之前经过了 Timeout,则原始线程会移到就绪队列以便重新获取锁。

当前拥有指定对象上的锁的线程调用Pulse方法以便向等待队列中的下一个线程发出锁的信号。接收到脉冲后,等待线程就被移动到就绪队列中。在调用 Pulse 的线程释放锁后,就绪队列中的下一个线程(不一定是接收到脉冲的线程)将获得该锁。

 

wait()方法与Pulse()方法一般成对使用,如果调用了wait()方法而没有使用Pulse()方法对调用wait的线程发送脉冲信号,则会导致则下一个调用 Wait 的线程将阻止,从而导致死锁。

posted @ 2011-11-25 12:17  Silence_  阅读(626)  评论(0)    收藏  举报