C# 使用lock关键字lock不同的对象
2010-11-19 16:02
281 查看
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)
代码
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:本人水平有限,如果错漏还请大家帮忙...
是调用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)
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { public class ClassA { public void Test() { lock (this) { Console.WriteLine("Test Begin Lock"); Thread.Sleep(10000); Console.WriteLine("Test End Lock"); } } } class Program { static void Main(string[] args) { ClassA classA = new ClassA(); ThreadPool.QueueUserWorkItem(p => { Thread.Sleep(3000); Console.WriteLine(" Thread2 Begin Test"); lock (classA) { Console.WriteLine("Thread2 Begin Lock"); Thread.Sleep(1000); 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# lock关键字的使用
- C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
- C#中Lock关键字的使用
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
- C#Lock关键字的使用
- C#中Monitor对象与Lock关键字的区别分析
- 使用显式的Lock对象取代synchronized关键字进行同步
- 转:C#中Monitor对象与Lock关键字的区别分析
- C#中Monitor对象与Lock关键字的区别分析
- C#中怎么使用lock关键字
- 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字
- C#之转换两个不同类型但是成员相同的对象
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [1] CLR 支持
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- 使用 Object.create 创建对象,super 关键字,class 关键字
- 使用lock对象显示的锁定资源
- 18个不常见的C#关键字,您使用过几个?
- C#中Lock使用
- C# 使用 protobuf 进行对象序列化与反序列化