C# Lock

当运行一个程序时就开启了一个进程,一个进程中包含可以开多个线程,这些线程分用户界面线程和工作线程。用户界面线程随程序的起动、关闭而同时启动、关闭。工作线程,分前台线程和后台线程,后台线程随程序的关闭而关闭,而前台线程则时先关闭这个前台线程或等到它执行完毕再关闭程序。线程可以开多个,但是多个线程间所执行的代码块却有可能是相同的,多个线程都要执行这段代码块可能会涉及一些状态或数据等的修改,而其它的线程又可能会因为这段代码执行完成后的状态或数据而不按预先设定的逻辑执行,导致数据混乱。这种情况下就要对这个可能被不同线程的代码进行锁定,以保证在同一时刻只有一个线程访问。也就是说使用Lock()的目地是为了保证线程安全(代码所在进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其它的变量的值也和预期是一样的,就是线程安全。_baiDu)。

一、Lock的执行流程

判断当前代码是否被锁定,如果没有锁定锁写,否则一直等待(挂起),直到要执行的代码被解锁;被锁定的代码在解锁后释放,并开放给其它代码使用,处于要执行当前代码的被挂起的队列中第一位的开始执行这段代码,这段代码再次被锁定,执行完毕后解锁,排列中的其它线程又按照排列顺序执行。在代码的锁定期间,其它线程不能访问这段代码。

二、Lock(this)与Lock(obj)

所有的锁定可分为锁定本身和非本身,这个本身指的是当前对象。

当对一个代码块执行了Lock(this)后,将导致整个对象(类)无法被其他线程访问,包括主线程。

而锁定的是非this时,则只会针对指定的代码块,在MSDN中推荐private static 对象变量来保护所有实例所共有的数据,在使用时,常使用public static readonly object lockObject = new object();的方式。添加readonly是为了确保对象的唯一性,因为如果在锁定的这段代码中改变了lockObject = new Object();就会是每次锁定的不是同一个对象,就达不到锁定的效果,而这种情况很少。

A Lock(this):将导致整个对象(类)无法被其他线程访问,包括主线程。简单的理解就是一个类有甲、乙、丙三个方法,在乙中进行了锁定后,直到这个锁被解决锁前这个类中的所有代码都不能被其它线程使用。

B Lock(1):锁定项不能为值类型,因为Lock本质上是Monitor.Enter,Monitor.Enter会使值类型装箱,每次Lock的是装箱后的对象,Lock的对象不同,就达不到锁定的效果。

C Lock(typeOf(MyLock)):由于一个类的所有实例都只有一个类型对象,该对象是typeOf的返回结果,锁定了它就锁定了这个对象(类)的所有实例。这个时候就要特别注意,如果不仅仅是在这里使用,在其它地方还使用了这个类的实例的时候,这里一进行类型锁定,其它地方的这个类的实例也暂时不能用了,所有对这个实例的访问全部挂起,直到对这个类型锁定释放。

D Lock(“MyLock”):锁定字符串,由于进程中使用同一字符串的任何其它代码将共享同一个锁,所以当使用字符串锁定的时候,其它地方使用了这个字符串的地方将被挂起,直到这个字符串锁被解锁。

学习时的笔记,网络有参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值