发布
社区首页 >问答首页 >为什么在lock语句中指定同步对象是强制性的?

为什么在lock语句中指定同步对象是强制性的?
EN

Stack Overflow用户
提问于 2012-12-29 21:05:36
回答 4查看 527关注 0票数 3

我正试图把我的注意力集中在锁语句中到底发生了什么。

如果我没听错的话,lock语句是语法糖,下面是.

代码语言:javascript
代码运行次数:0
复制
Object _lock = new Object();

lock (_lock)
{
    // Critical code section
}

...gets被翻译成大致类似于:

代码语言:javascript
代码运行次数:0
复制
Object _lock = new Object();

Monitor.Enter(_lock);
try
{
    // Critical code section
}
finally { Monitor.Exit (_lock); }

我已经使用了几次lock语句,并且总是创建一个私有字段_lock,作为一个专用的同步对象。我理解为什么不应该锁定公共变量或类型。

但是为什么编译器不同时创建这个实例字段呢?实际上,我觉得可能会出现开发人员想要指定锁定什么的情况,但根据我的经验,在大多数情况下,完全没有兴趣的情况下,您只是想要锁!那么为什么没有无参数的锁过载呢?

代码语言:javascript
代码运行次数:0
复制
lock()
{
   // First critical code section
}

lock()
{
   // Second critical code section
}

将被翻译成(或类似):

代码语言:javascript
代码运行次数:0
复制
[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); }

编辑:我显然对多个锁语句不太清楚。更新问题以包含两个锁语句。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-01 02:27:27

为了让这个没有变化的东西起作用,你必须:

  • 每个锁块有一个自动生成的锁变量(这意味着不能有两个不同的锁块锁定在同一个变量上)
  • 对同一个类中的所有锁块使用相同的锁变量(这意味着不能保护两个独立的东西)

另外,您还需要确定应该是实例级的还是静态的。

最后,我猜想语言设计人员并不认为在特定情况下的简化是值得在阅读代码时引入歧义的。线程代码(这是使用锁的原因)已经很难正确地编写和验证。让事情变得更困难不是件好事。

票数 1
EN

Stack Overflow用户

发布于 2012-12-29 21:07:46

需要存储锁的状态。不管它是否被输入。这样,尝试进入同一锁的另一个线程就可以被阻塞。

这需要一个变量。只是一个非常简单的东西,一个普通的物体就足够了。

这样一个变量的一个困难要求是在任何lock语句使用它之前创建它。尝试按您的提议动态创建它会产生一个新的问题,现在需要使用锁来安全地创建变量,以便只有进入锁的第一个线程创建它,而其他试图进入锁的线程被阻塞,直到它被创建。这需要一个变量。等等,一个无法解决的鸡与蛋问题。

票数 3
EN

Stack Overflow用户

发布于 2012-12-29 21:15:19

在某些情况下,您需要两种不同的lock,它们是相互独立的。这意味着当代码的一个“可锁”部分被锁定时,另一个“可锁定”不应该被锁定。这就是为什么能够提供锁对象的原因--您可以为几个独立的lock提供其中的几个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14085924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档