线程学习8——Monitor类

Monitor类提供同步对对象的访问的机制。lock语句就是由编译器解析为使用Monitor类。

例如:lock(obj) {.........}

解析为Monitor.Enter ()方法,该方法会一直等待,直到线程获得对象的锁定为止。

那么如何解除锁定呢?Monitor类提供了Exit()方法解除锁定。

Monitor类具有以下功能:

  • 它根据需要与某个对象相关联。

  • 它是未绑定的,也就是说可以直接从任何上下文调用它。

  • 不能创建 Monitor 类的实例。

Monitor类的方法:

Enter,TryEnter:获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。

Wait:释放对象上的锁以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。

Pulse(信号),PulseAll:向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。

等待线程被放置在对象的就绪队列中以便它可以最后接收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。

Exit:释放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。

Monitor类与lock语句:

与c#的lock语句相比,Monitor类的主要优点是:可以添加一个等待获得锁定的超时值,这样就不会无限期地等待获得锁定,

而可以使用TryEnter方法,给它传送一个超时值,确定等待获得锁定的最长时间。

例如:

 
  
if (Monitor。TryEnter(obj, 500 ))
{
try
{
...........
}
finally
{
//当时间超过500毫秒的时候,线程不再等待
Monitor.Exit(obj);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值