c# 中对lock中参数讨论

由于要实现多线程写同一文件,所以使用了lock锁对代码块加互斥锁,来达到多线程同步的目的。貌似以前都没有认真的了解过lock,今天百度了一下,做个小结。

首先我想再解释一下使用背景,严格意义上来讲,这是个单生产者和单消费者模型,虽然有多线程产生了需要写入文件的内容,但是写的笔始终是那一只(一个单例的对象),如果有两个线程走到了写入文件这一步,就只有一个线程能获得写该文件的锁,另一个线程要等待锁释放才能写入,这样来保证文件被顺序写入,也不会有已写入内容被覆盖,而且是0拷贝的。当然你也可以给每个线程维护一个缓存,当缓存区满了就去通知写文件的线程,并告诉它需要写多少,当写入线程的缓存满了就写到文件里去,或许可以实现多生产者单消费者模型,这样就要将内容在内存里搬来搬去,所以就算提高了写入文件的速度还是要以消耗内存空间为代价。

c#提供的lock关键字,可以控制线程同步执行一段代码,如果没有lock可能多线程执行该段代码时就会使数据发生线程间不可见的混乱。所以对于本应用情景就是将写入文件的代码用lock括起来啦。

大家都知道lock的参数是实例对象,具体应该如何甄别呢?
1、不能是primitive type,比如int bool 等
如果是int,那么传入时势必会发生装箱操作,这会导致每次lock的对象都不一样,就没办法实现多线程同步了。
2、最好不是public类的对象
如果是public类的对象,万一不知情的线程new出实例然后又对它加锁,就可能导致死锁。
3、不能是string的实例
c#中字符串都是在CLR暂留的,整个程序使用这个字符串的都是一个实例对象,如果有两个互不知情的线程对它加锁就会导致死锁了。
4、不能是函数的局部变量
如果函数内部声明一个变量int a,用lock(a)去锁这个函数的一段代码,多线程执行该段代码时都会产生新的a,就没办法告诉彼此是否在占用资源,也就无法实现同步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值