我正试图围绕lock 语句中究竟发生了什么。
如果我理解正确,lock 语句是语法糖,以下是...
Object _lock = new Object();
lock (_lock)
{
// Critical code section
}
...被翻译成大致如下:
Object _lock = new Object();
Monitor.Enter(_lock);
try
{
// Critical code section
}
finally { Monitor.Exit (_lock); }
我已经使用了几次 lock 语句,并且总是创建一个私有字段_lock
,作为一个专用的同步对象。我确实理解为什么您不应该锁定公共变量或类型。
但是为什么编译器不创建该实例字段呢?我觉得实际上可能存在开发人员想要指定锁定什么的情况,但根据我的经验,在大多数情况下,这完全没有兴趣,你只想要那个锁!那么为什么没有无参数的锁重载呢?
lock()
{
// First critical code section
}
lock()
{
// Second critical code section
}
将被翻译成(或类似的):
[DebuggerHidden]
private readonly object _lock1 = new object()
[DebuggerHidden]
private readonly object _lock2 = new object()
Monitor.Enter(_lock1);
try
{
// First critical code section
}
finally { Monitor.Exit(_lock1); }
Monitor.Enter(_lock2);
try
{
// Second critical code section
}
finally { Monitor.Exit(_lock2); }
编辑:我显然不清楚多个锁定语句。更新了问题以包含两个锁定语句。