C# 封口周围的锁是否也能保护封口的内容?

C# 封口周围的锁是否也能保护封口的内容?,c#,locking,C#,Locking,假设我有以下代码: lock (this.myLock) { this.myTimer = new Timer(_ => { this.myConcurrentlyAccessedInt += 1; }, null, 1000, Timeout.Infinite); } 将myLock保护myconcurrentlyaccessedin 旁注:我知道对于这个用例,我应该使用Interlocked。我只是用这个简单的例子来探索lock包装闭包的语义。我猜它不会保护myC

假设我有以下代码:

lock (this.myLock)
{
  this.myTimer = new Timer(_ =>
  {
    this.myConcurrentlyAccessedInt += 1;
  }, null, 1000, Timeout.Infinite);
}
myLock
保护
myconcurrentlyaccessedin


旁注:我知道对于这个用例,我应该使用
Interlocked
。我只是用这个简单的例子来探索
lock
包装闭包的语义。我猜它不会保护myConcurrentlyAccessedInt,但我想确定一下。

lock
关键字本身不会保护任何变量

lock
所做的是允许一个线程进入并执行以下语句块

根据@Enigmativity在评论中明确指出:

锁工作的唯一方式是如果对变量的所有访问都受到锁的保护

在您的情况下,
myConcurrentlyAccessedInt
不受
myLock
保护,因为增量不会发生在受
myLock
保护的语句中

要获取
myLock
以保护
myconcurrentlyaccessedin
,您需要仅在使用
myLock
保护的语句中读取和写入
myconcurrentlyaccessedin

例如,在下面的代码中,
myConcurrentlyAccessedInt
myLock
保护:

lock(myLock)
{
    this.myTimer = new Timer(_ =>
    {
        lock(myLock)
        {
            this.myConcurrentlyAccessedInt += 1;
        }
    }, null, 1000, Timeout.Infinite);

    this.myTimer2 = new Timer(_ =>
    {
        lock(myLock)
        {
            this.myConcurrentlyAccessedInt -= 1;
        }
    }, null, 1000, Timeout.Infinite);
}

这是不清楚和不明确的。只有第二段是清楚的。第1段是错误的,因为它保护
myTimer
变量。您的第三段建议,
lock
中的语句受保护-
myConcurrentlyAccessedInt
在源代码中出现在
lock
中,所以您是说它应该受到保护?@Enigmativity锁如何保护
myTimer
?当计时器在lock语句中时,您不能从另一个线程修改它吗?这对于
锁中的任何变量都是正确的。
工作的唯一方式是,对变量的所有访问都受到
的保护。如果您知道
中有哪些语句,以及哪些语句没有,则第三点是正确的。OP显然不明白这一点。你没有说什么来澄清这种混乱。这就是我的观点的关键所在。@神秘性是真的。现在修订版怎么样?