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

有点乱,就写到这里吧! 

原文地址:https://www.cnblogs.com/8090sns/p/3226988.html