C#中的lock语句是怎么回事,有什么作用?
C#中的lock语句将lock中的语句块视为临界区,让多线程访问临界区代码时,必须顺序访问。他的作用是在多线程环境下,确保临界区中的对象只被一个线程操作,防止出现对象被多次改变情况。
那么问题来了,lock中参数是一个对象,我们是否可以为任何类型对象?以下是我的一些总结
1.lock(this),主要问题是如果类为实例化类,那么this也只是当前实例,不能起到锁定的作用。
分析:lock(this) 锁定的对象是当前类实例,而每个线程操作的都是新实例,lock(this)只对当前实例起作用,lock(this)实际上是没实现我们想要的结果。而lock(obj)的实例,锁定的是静态变量object,所以能够锁定每个实例。
2.lock(typeof())问题在于锁定对象类型当相于锁定类型中的静态对象部分,锁定了所有实例,速度慢;另一方面,有可能程序其他部分在访问该对象,已经替您锁定,将导致您锁定语句的挂起。
3.lock(“”)问题在于微软将内容相同的字符串视为同一个对象,如果您在此锁定了他,那么其实是锁定了同一个对象,将阻止其他地方对字符串的锁定。与锁定lock(1)是一样的道理。
所以以上都不可以进行作为锁参数。最好的参数形式为
private static object obj = new object();
lock(obj);
但是需要注意每一个多线程要重新new一个object,不然其与this的道理是一样的。