浅谈对C#-lock()的理解-转载

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的道理是一样的。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值