Lock在MSDN的定义:
lock关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
lock应用:经常用于防止多线程操作导致公用变量值出现不确定的异常,用于确保操作的安全性。
如上面代码,当线程1和线程2都来调用这个方法的时候,当线程1先调用,线程1就会申请互斥锁,当线程2再来执行时,发现lock这里已经申请了互斥锁,所以线程2需要等待线程1执行完成后,释放互斥锁,线程2才能申请新的互斥锁并执行lock里面的代码。
注意:
- lock不能锁定空值,但Null是不需要被释放的。
- lock不能锁定string类型,虽然它也是引用类型的。因为字符串类型被CLR“暂留”。即整个程序中任何给定字符串都只有一个实例,具有相同内容的字符串都代表着同一个实例。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中与该字符串具有相同内容的字符串。因此,最好锁定不会被暂留的私有或受保护成员。
- 值类型不能被lock,因为前文标红字的“对象被释放”,值类型不是引用类型的
- lock就避免锁定public 类型或不受程序控制的对象
- lock锁定的对象是一个程序块的内存边界