闭包周围的锁是否也能保护闭包的内容?
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
例如,在下面的代码中,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);
}
假设我有以下代码:
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
例如,在下面的代码中,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);
}