C# 使用lock关键字lock不同的对象
c# lock关键字的本质
是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj)
在obj是不同数据类型的时候会出现不同的情况
1.锁定类型 例如lock(typeof(int)) lock(typeof(ClassA)) // CalssA 是一个类的定义
备注:前者作用范围跨AppDomain 不跨Process, 后者不跨AppDomain(默认设置)
使用范围:绝不推荐使用
2.锁定字符串 例如lock("abc") 和lock(s)//s是一个字符串的实例变量
备注:当字符串已经驻留在内存的时候 这个lock是有效的, 如果字符串未驻留在内存那么这个lock就失效了,该lock是跨Appdomain不跨Process
使用范围: 一般不推荐使用
以下代码显示了非驻留字符串导致的无法lock的问题,请在实际应用中避免lock(a+b)即使他们的值一样 (vs2008 Debug)
Console.WriteLine("Thread1 End Lock");
}
}
}
}
3.所有继承于System.MarshalByRefObject 的对象 ,例如Remoting Service之类的
备注:锁定的是代理对象,在远端的对象并没有被锁定(byValue 和byRef 两种类型传数据也有影响)
使用范围:不推荐
4.值类型, 由于众所周知的装箱的问题...实际上锁定根本不生效
使用范围:不推荐
5. 应用[MethodImpl(MethodImplOptions.Synchronized)]标记的类
实例方法锁定的是this lock(this)
静态方法锁定的是typeof(ClassName) lock(typeof(ClassName)) //ClassName是你当前的类名
使用范围:不推荐, 调用静态方法将导致锁定类型, 实例方法之间也相互影响锁定关系
6.lock(this)
很容易误用,例如在web page上调用 lock(this)....由于asp.net会为每次httpRequest , new一个类的实例...所以lock(this)在这里一点作用都没有
在其他的情况下:lock(this)锁定了本身,那么但其他外部对象试图使用这个类的时候会有困扰
如果你的类是public给其他人用的,那么最好不要lock(this)
请参考以下代码(不推荐使用)
Console.WriteLine("Thread2 End Lock");
}
});
classA.Test();
Console.ReadLine();
}
}
}
7. lock(null) 必然抛出一个异常
8.推荐使用以下方法lock
private static object asyncLock=new object();
lock(asyncLock)
使用 private object asyncLock=new object(); 也是ok的,但是请注意避免之前提到的WebPage每次new一个类导致lock失效的问题
影响范围不跨AppDomain
PS1:关于跨不跨AppDomain的问题,其实用处不大,大部分应用程序都只是创建一个DefaultDomain
PS2:可以将一些Assembly设置为跨AppDomain的,以减少内存浪费和提高性能, 例如string和一些基本类型都是这样实现的
PS3:本人水平有限,如果错漏还请大家帮忙...
C# 使用lock关键字lock不同的对象的更多相关文章
- C#中Monitor对象与Lock关键字的区别分析
这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(ob ...
- 转:C#中Monitor对象与Lock关键字的区别分析
Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- lock和Monitor(锁对象)
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...
- C#的lock关键字
using System; using System.Threading; namespace Test { class Program { //一.Lock定义 //lock 关键字可以用来确保代码 ...
- C#中Monitor类、Lock关键字和Mutex类
线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程.多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率.多线程的应用程序域是相当不稳定的,因为多个线程 ...
- C#中的lock关键字有何作用
作为C#的程序员来说,在遇到线程同步的需求时最常用的就是lock关键字.但如何正确并有效地使用lock,却是能否高效地达到同步要求的关键.正因为如此,程序员需要完全理解lock究竟为程序做了什么. 所 ...
- Thread锁 Monitor类、Lock关键字和Mutex类
Monitor 类锁定一个对象 当多线程公用一个对象时,也会出现和公用代码类似的问题,这种问题就不应该使用lock关键字了,这里需要用到System.Threading中的一个类Monitor,我们可 ...
- lock关键字理解
>可以把lock关键字可以看成 try{ Monitor.Enter(x); //.. } finally{ Monitor.Exit(x); } 这样子的结构,当然使用lock关键字更方便 & ...
- C#中的lock关键字;就是lock住一个大家都共同访问的(静态static的)东东就行了
public class ChatService : IChat //继承IChat接口或者说IChat的实现类 { //定义一个静态对象用于线程部份代码块的锁定,用于lock操作 private s ...
随机推荐
- angularjs - 415 (Unsupported Media Type)
angularJs+springMVC angular表单提交一个user实体时,报 angularjs - 415 (Unsupported Media Type)错误!! 原因是$http({ u ...
- iOS审核秘籍】提审资源检查大法
iOS审核秘籍]提审资源检查大法 2015/11/27 阅读(752) 评论(1) 收藏(6) 加入人人都是产品经理[起点学院]产品经理实战训练营,BAT产品总监手把手带你学产品点此查看详情! 本篇主 ...
- fight
为啥用block copy. 从栈到拷贝到堆 循环引用,控制器引用block. block里面调用 self self引用控件,控件引用block,block里面引用self http://www. ...
- Java 操作符
子系统的特点 instanceof 操作符 Animal类是Dog的直接父类,Creature类和Object类是Dog的间接父类,因此 Dog dog=new Dog(); System.out.p ...
- 盒模型--padding
突然增加padding会使盒子变大,所以要按实际情况做调整. 没有写padding的时候: <style>div{ background:gray;}</style></ ...
- 使用CMD命令设置IP
使用CMD命令设置IP,将下面文本保存为bat文件后执行 netsh interface ip set address name="本地连接" source=static addr ...
- RDIFramework.NETV2.9版本 Web新增至14套皮肤风格+三套界面组合(共42套皮肤组合)
客户的心声是最重要的,RDIFramework.NET V2.9版本不仅对WinForm版做了大的调整,Web版也彻彻底底的底翻上的优化了一篇,不仅增加了很多的新功能.新特色,用户最期望的界面风格也进 ...
- [推荐] WordPress主题使用Google Fonts字体访问不了的解决办法
外国人做的WordPress主题喜欢带上Google的字体,但到了咱天朝是没法访问fonts.googleapis.com的 现有数字公司出的公共资源库可以替换,把fonts.googleapis.c ...
- iOS-打开word、ppt、pdf、execl文档方式
这里面包括下载和打开文档的操作:需要先导入<AFNetworking>的框架 第一步:创建一个显示文档的view:ReadViewController (1).h的代码如下: @inter ...
- Windows消息机制概述
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程 ...