博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C#】【Thread】Monitor和Lock
阅读量:5234 次
发布时间:2019-06-14

本文共 2058 字,大约阅读时间需要 6 分钟。

所谓锁,就是之锁定的区域只能单个线程进入进行操作,其他线程在锁的外围等待。 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, 1000);//启动锁,也是区别于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。

转载于:https://www.cnblogs.com/mqxs/p/4639367.html

你可能感兴趣的文章
{面试题7: 使用两个队列实现一个栈}
查看>>
【练习】使用事务和锁定语句
查看>>
centos7升级firefox的flash插件
查看>>
Apache Common-IO 使用
查看>>
评价意见整合
查看>>
二、create-react-app自定义配置
查看>>
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>
linux常用命令
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>