Lock VS Monitor
Lock Monitor
多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换
首先,看代码:
private static object syncroot = new object();
public static void Gets()
{
lock(syncroot)
{
Console.WriteLine("sbzgw");
Console.Read();
}
}
上段代码中,是Lock的典型应用
但是,在使用Lock时候有一些注意事项:
1,Lock里面的参数必须是引用类型,不能是值类型,Lock是对象锁,否则会产生一个不同的引用类型对象,简单介绍下值类型和引用类型
值类型,参数传递的时候,把自己的值给别人复制一份,无论复制的值如何改变,不会影响原来被复制的值
引用类型,参数传递的时候,传递的内存地址,如果复制的值改变,原来的值也为改变
2, 如果类类型是public的,最好不要用Lock,因为别人都可以用,别人不知道你锁定了,如果他new一个,并且上锁,你也Lock,这时候就造成死锁了
3,如果MyType是public,不要Lock
4,永远不要Lock一个字符串
Lock在实际运用中可以用Monitor(监视器)来替换
Lock更简洁,使用更方便,可以确保即使发生异常,也可以释放基础监视器,实际上,Lock就是用Monitor来实现的,调用了finally释放资源
推荐实际使用中用Lock
Monitor是一个静态类,不能实例化,只能调用其中的方法
上面的代码可以改成下面的写法
//Monitor注意要配对使用
private static object syncroot = new object();
public static void Get2()
{
Monitor.Enter(syncroot);
try
{
Console.WriteLine("sbwgy");
Monitor.Pulse(syncroot);
}
finally
{
Monitor.Exit(syncroot);
}
Console.Read();
}
这就是Monitor替换Lock的写法
其实,感觉Lock和Monitor的关系很想.net里面的有个关键字Using,其实Using就是自动执行了Dispose方法,让我们不用担心资源的回收了,但是,不好的地方就在于,长期这么使用,或者一开始就这么用的话,我们可能并不清楚Using都替我们干了些什么事情
有点乱,就写到这里吧!
Lock VS Monitor的更多相关文章
- 线程与并发系列一:Lock、Monitor、UserSpinLock
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- 基础才是重中之重~lock和monitor的区别
回到目录 Monitor的介绍 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中 ...
- lock和Monitor(锁对象)
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- 线程同步 – lock和Monitor
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...
- 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
“线程同步”的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...
- lock,Monitor,Mutex的区别
lock和Monitor的区别 一.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 二.Monitor有TryEnter的功能,可以防止出现死锁的问题,lo ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- C#多线程系列(2):多线程锁lock和Monitor
1,Lock lock 原型 lock 编写实例 2,Monitor 怎么用呢 解释一下 示例 设置获取锁的时效 C# 中,可以使用 lock 关键字和 Monitor 类来解决多线程锁定资源和死锁的 ...
- C# 队列Queue,ConcurrentQueue,BlockingCollection 并发控制lock,Monitor,信号量Semaphore
什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.Bl ...
随机推荐
- linux下的基本操作
1.怎么在Ubuntu下安装flash插件 2.Ubuntu14.04安装wineqq国际版 注: 安装包wine-qqintl下载 在/usr/share/applications/下可找到国际版q ...
- 3_for循环的拓展应用
HTML代码: <input type="button" value="1"/> <input type="button" ...
- permutation II (boss出来了)
题目链接:https://leetcode.com/submissions/detail/55876321/ 自己的做法,30个测试用例通过了29例,终究还是有一个系列类型的是无法通过的,因为自己妄想 ...
- android 中View的优化
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候, ...
- 高德地图API编译警告
版本: V2.1.1 警告内容: (null): warning: (i386) /Users/xiaominghan/Desktop/autonavi/MAMapKit_3D_r923_201310 ...
- 每天记一些php函数,jQuery函数和linux命令(二)
简介:学习完了php和jQuery之后,对函数的记忆不到位,导致很多函数没记住,所以为了促进自己的记忆,每天花一点时间来写这个博客. 时间:2016-12-19 地点:太原 天气:晴 一.p ...
- oracle根据视图删除表
delete from t_fwaqjcjl where zcbm in (select zcbm from view_fwaqjcjl where 1=1 )
- TestNG参数化测试【转】
原文:http://www.yiibai.com/testng/20130916303.html 在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大 ...
- sql 动态语句
如果动态语句有表变量 例子如下: declare @mS varchar(10) declare @mE varchar(10) declare @mSQL nvarchar(500) --SQL语句 ...
- Failed to load JavaHL Library.
以前使用的电脑是32位的,安装的svn可以正常使用,但是现在的电脑室64位的,安装好svn后,把项目提交到svn的过程中,总是弹出来一个错误的对话框: Failed to load JavaHL Li ...