所谓锁,就是之锁定的区域只能单个线程进入进行操作,其他线程在锁的外围等待。
Monitor锁通过Monitor.Enter(obj)和Monitor.Exit(obj)来锁定和解锁。
Lock锁则直接Lock(obj)进行锁定。
Monitor锁和Lock锁很类似,实质Lock锁是Monitor的变体。
lock(obj)
{
}
等价为:
try
{    
   Monitor.Enter(obj) 
}
catch()
{}
finally
{
   Monitor.Exit(obj) 
}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。
下面讲一下Monitor的特殊与Lock功能。
Monitor.Enter(obj);// 启动锁
Monitor.TryEnter(obj, );//启动锁,也是区别于Lock的功能,多了一个时间设置,就是等待多少时间后如果还不能进入,则取消此次操作。Lock则会一直等待下去。
Monitor.Wait(obj);// 会放弃当前线程对资源的所有权,让别的线程到lock进来。然后当别的线程代码里Pulse一下(让原线程进入到等待队列),之后从Waint()后面继续运行下去
Monitor.Pulse(obj);// 恢复原放弃资源控制权的线程,使其重新进入到等待队列中,下次直接从Wait()后继续运行。
Monitor.PulseAll(obj);// 恢复所有曾今放弃资源控制权的线程,使其重新进入到等待队列中
Monitor.Exit(obj);// 结束锁
例子:
        [MethodImpl(MethodImplOptions.Synchronized)]
private void FirstThread()
{
//Monitor.Enter(this);
Monitor.Wait(this);
MessageBox.Show("FirstThread");
//Monitor.Exit(this);
}
private void SecondThread()
{
Monitor.Enter(this);
Monitor.Wait(this);
MessageBox.Show("SecondThread");
Monitor.Pulse(this);
Monitor.Exit(this);
}
private void ThirdThread()
{
Monitor.Enter(this);
MessageBox.Show("ThirdThread");
Monitor.Pulse(this);
Monitor.Exit(this);
}

调用:

Thread thread = new Thread(new ThreadStart(FirstThread));
thread.Name = "thread1";
Thread thread2 = new Thread(new ThreadStart(SecondThread));
hread2.Name = "thread2";
Thread thread3 = new Thread(new ThreadStart(ThirdThread));
thread3.Name = "thread3";
thread.Start();
thread2.Start();
thread3.Start();

运行结果:

首先线程会进入到FirstThread方法,然后因为Wait了,所以线程1放弃所有权,然后线程2进入SecondThread,因为也Wait了,所以线程3进入ThirdThread,然后会MessageBox弹出“TirdThread”,之后运行Pulse,所以释放了线程2,所以线程2会MessageBox弹出“SecondThread”,之后再释放线程1弹出“FirstThread”。

每一个锁都必须要有Enter和Exit,里面参数是一个Object类型,是一个锁的标识。

在这FirstThread方法中没有使用Enter和Exit而是使用了

[MethodImpl(MethodImplOptions.Synchronized)]
这个作用相当于在这个方法开始和结尾处分别加上了Enter和Exit。

最新文章

  1. XFire完整入门教程
  2. 利用iframe实现无刷新上传处理
  3. VB6.0 调用存储过程
  4. 创建型模式之Singleton模式
  5. jQuery1.9.1源码分析--Ajax模块
  6. Windows Serer 2003 配置手册 – 创建Active Dictionary域
  7. Docker 集群环境实现方式
  8. VS2015 密钥key
  9. 【一天一道LeetCode】#95. Unique Binary Search Trees II
  10. MyDAL - .UpdateAsync() 之 .Set() 使用
  11. 基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
  12. OOP AOP
  13. Hulu大规模容器调度系统Capos
  14. kalinux 换源
  15. DRF的分页
  16. Pandas的concat方法
  17. 【Codeforces 498B】 B. Name That Tune (概率DP)
  18. 51nod1203 JZPLCM 线段树 + 扫描线
  19. java---sychronized的深入理解
  20. c# DataTable 数据集处理DataTableHandler

热门文章

  1. ExtJs中xtype与组件类的对应表
  2. MVC中的CSRF解决方案
  3. Iterator 迭代器(一)
  4. iOS开发笔记5:多线程之NSThread、NSOperation及GCD
  5. PAT 01-2
  6. I/O多路复用——select函数与poll函数
  7. Json常用的转换
  8. 从零开始学习Mysql的学习记录
  9. spring mvc 配置文件拦截器过滤url
  10. python datetime模块参数详解