Monitor类提供同步对对象的访问的机制。lock语句就是由编译器解析为使用Monitor类。
例如:lock(obj) {.........}
解析为Monitor.Enter ()方法,该方法会一直等待,直到线程获得对象的锁定为止。
那么如何解除锁定呢?Monitor类提供了Exit()方法解除锁定。
Monitor类具有以下功能:
-
它根据需要与某个对象相关联。
-
它是未绑定的,也就是说可以直接从任何上下文调用它。
-
不能创建 Monitor 类的实例。
Monitor类的方法:
Enter,TryEnter: 获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。
Wait: 释放对象上的锁以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。
Pulse(信号),PulseAll: 向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。
等待线程被放置在对象的就绪队列中以便它可以最后接收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。
Exit: 释放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。
Monitor类与lock语句:
与c#的lock语句相比,Monitor类的主要优点是:可以添加一个等待获得锁定的超时值,这样就不会无限期地等待获得锁定,
而可以使用TryEnter方法,给它传送一个超时值,确定等待获得锁定的最长时间。
例如: