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都替我们干了些什么事情 

有点乱,就写到这里吧! 

 

 

转载于:https://www.cnblogs.com/A-I/archive/2010/09/01/1814463.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值