春节前整理回顾一些知识点,今天要写的是C#中 lock关键字的使用。
lock使用的场合是多线程环境中保证lock的代码段只能被一个线程访问。
1、lock本质:编译后的IL代码就是Monitor.Enter,在finally代码块中Exit 。4.0版本后对lock的退出进行isGetLock判断
2、lock只能锁定引用类型,即使编译器允许锁值类型最终还是会装箱,装箱后内存地址改变了相当于不锁,因此锁值类型是编译不过的。但Monitor.Enter没有做此限制
3、lock对象的选择,lock可以锁字符串、类型和实例对象。
锁字符串:由于字符串在CLR的驻留机制,若整个程序域中有多个地方同时lock同一个字符串,一旦一个lock进入的时候会导致另外一个lock处于等待状态,是很可怕的事情,因为它的影响范围太大,超出了代码编写者的本意。可见一般不建议lock字符串的道理在此,锁类型也是同样的情况。
lock对象一般建议为 private readonly object 或private static readonly object,若锁定的范围是限定为本类实例内不给重入则选择实例对象,否则选择静态变量,选择锁this也是一种选择。锁什么对象怎么锁记住一点:被锁对象地址改变锁失效,并灵活运用即可。