闭包周围的锁是否也能保护闭包的内容?

Does a lock around a closure also protect the contents of the closure?

假设我有以下代码:

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

myLock 会保护 myConcurrentlyAccessedInt 吗?

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

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

lock的作用是允许一个线程进入并执行下面的语句块。

根据@Enigmativity 在评论中明确表示:

The only way a lock works is if all access to a variable is protected by a lock.

在您的例子中,myConcurrentlyAccessedInt 不受 myLock 保护,因为增量不会发生在受 myLock 保护的语句中。

要让 myLock 保护 myConcurrentlyAccessedInt,您只需要在使用 myLock.

保护的语句中读写 myConcurrentlyAccessedInt

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

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);
}