我正试图把我的注意力集中在锁语句中到底发生了什么。
如果我没听错的话,lock语句是语法糖,下面是.
Object _lock = new Object();
lock (_lock)
{
// Critical code section
}
...gets被翻译成大致类似于:
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); }
编辑:我显然对多个锁语句不太清楚。更新问题以包含两个锁语句。
发布于 2013-01-01 02:27:27
为了让这个没有变化的东西起作用,你必须:
另外,您还需要确定应该是实例级的还是静态的。
最后,我猜想语言设计人员并不认为在特定情况下的简化是值得在阅读代码时引入歧义的。线程代码(这是使用锁的原因)已经很难正确地编写和验证。让事情变得更困难不是件好事。
发布于 2012-12-29 21:07:46
需要存储锁的状态。不管它是否被输入。这样,尝试进入同一锁的另一个线程就可以被阻塞。
这需要一个变量。只是一个非常简单的东西,一个普通的物体就足够了。
这样一个变量的一个困难要求是在任何lock语句使用它之前创建它。尝试按您的提议动态创建它会产生一个新的问题,现在需要使用锁来安全地创建变量,以便只有进入锁的第一个线程创建它,而其他试图进入锁的线程被阻塞,直到它被创建。这需要一个变量。等等,一个无法解决的鸡与蛋问题。
发布于 2012-12-29 21:15:19
在某些情况下,您需要两种不同的lock
,它们是相互独立的。这意味着当代码的一个“可锁”部分被锁定时,另一个“可锁定”不应该被锁定。这就是为什么能够提供锁对象的原因--您可以为几个独立的lock
提供其中的几个。
https://stackoverflow.com/questions/14085924
复制相似问题