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显然不明白这一点。你没有说什么来澄清这种混乱。这就是我的观点的关键所在。@神秘性是真的。现在修订版怎么样?