Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。

Monitor通过enter和exit函数的组合,可以等效lock效果

 Monitor.Enter(obj);
//...
Monitor.Exit(obj); lock(obj)
{
//...
}

对象锁等效

与lock不同在于,Monitor更加灵活,可以通过Wait/Pulse,形成线程间的同步管理。当前获取到锁的线程(TA)通过Wait函数,释放对锁的控制,并将当前线程挂起为阻塞状态。这个时候其他线程就可以对锁资源进行竞争(假设在众多线程中TB获取到锁)。TA只有在接收到TB的Pulse信号,才能重新进入就绪状态,重新竞争锁资源。

注意Pulse函数是通知当前等待队列中第一个,PulseAll是通知所有等待队列中的线程。

 Thread th2 = new Thread(() =>
{
lock (aysncLock)
{
Console.WriteLine("th2 enter will wait");
Monitor.Wait(aysncLock);
Console.WriteLine("th2 continue");
}
});
Thread th3 = new Thread(() =>
{
lock (aysncLock)
{
Console.WriteLine("th3 enter will wait");
Monitor.Wait(aysncLock);
Console.WriteLine("th3 continue");
}
});
Thread th1 = new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds());
lock (aysncLock)
{
Console.WriteLine("th1 enter will pulseall");
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
//Monitor.PulseAll(aysncLock);
Monitor.Pulse(aysncLock);
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
Console.WriteLine("th1 exit");
}
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
}); th1.Start();
th2.Start();
th3.Start();
Console.ReadKey();

使用Pulse结果:

th2、th3只有一个执行

使用PulseAll结果:

th2、th3均执行

最新文章

  1. XML简介与CDATA解释
  2. DP专题训练之HDU 1231 最大连续子序列
  3. Jquery请求Ajax的json数据
  4. Caffe 抽取CNN网络特征 Python
  5. JavaScript闭包——实现
  6. Bugzilla 使用指南
  7. 页面上动态编译及执行java代码
  8. 七天学会SALTSTACK自动化运维 (3)
  9. Java笔记--Java的List、Iterator用法
  10. HUD 1501 Zipper(记忆化 or DP)
  11. java中equals方法和contentEquals方法区别
  12. nginx视频直播/点播服务干货分享
  13. [笔记]ACM笔记 - 自用模板
  14. Extjs6获取Grid里的数据(数据源)
  15. Ansible 系列之 Patterns
  16. Blending, Bootstrap
  17. spring boot -junit单元测试方法示例
  18. django--用户认证组件
  19. HwUI,CMS管理系统模板,漂亮,简单,兼容好
  20. YARN的设计

热门文章

  1. 关于.NET中的Session
  2. Spring Boot Oauth2
  3. 【转】使用JMeter进行负载测试——终极指南
  4. 表空间 -- tablespace
  5. 转:oracle常见重要视图-v$sql,v$sql_plan,v$sqltext,v$sqlarea,v$sql_plan_statistcs
  6. python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors
  7. [置顶] sscanf() - 从一个字符串中读进与指定格式相符的数据
  8. 第三章 服务治理: Spring Cloud Eureka
  9. Oracle11g-BBED安装
  10. 189. Rotate Array 从右边开始翻转数组