1.1 lock 语句
lock 语句用于获取某个给定对象的互斥锁,执行一个语句,然后释放该锁。
lock-statement:
lock ( expression ) embedded-statement
lock 语句的表达式必须表示一个已知的 reference-type 类型的值。永远不会为 lock 语句中的表达式执行隐式装箱转换(第 6.1.7 节),因此,如果该表达式表示的是一个 value-type 的值,则会导致一个编译时错误。
下列形式的 lock 语句
lock (x) ...
(其中 x 是一个 reference-type 的表达式)完全等效于
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}
不同的只是:实际执行中 x 只计算一次。
当一个互斥锁已被占用时,在同一线程中执行的代码仍可以获取和释放该锁。但是,在其他线程中执行的代码在该锁被释放前是无法获得它的。
建议不要使用锁定 System.Type 对象的方法来同步对静态数据的访问。其他代码可能会在同一类型上进行锁定,这会导致死锁。更好的方法是通过锁定私有静态对象来同步对静态数据的访问。例如:
class Cache
{
private static object synchronizationObject = new object();
public static void Add(object x) {
lock (Cache.synchronizationObject) {
...
}
}
public static void Remove(object x) {
lock (Cache.synchronizationObject) {
...
}
}
}