我已阅读 Microsoft 的 C# 引用中的以下内容:
lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.
具体是什么意思?
下面的代码是否没有像我预期的那样工作? (我希望 ReadyCount
是一致的)
public class Calculator
{
public int ReadyCount { get; private set; }
public void IncreaseReadyCount()
{
lock ("ReadyCount")
{
ReadyCount++;
}
}
public void Calculate()
{
Parallel.ForEach(list, litItem =>
{
IncreaseReadyCount();
});
}
}
最佳答案
问题是:那把锁的范围是什么? 你不能告诉;它至少等同于您的Calculator
类型的静态/全局,但它也可以巧合地被任何地方的任何其他代码共享 恰好执行 ldstr 'ReadyCount'
(返回实习版本)并对其进行锁定
(或使用 Monitor
, ETC)。不太可能,但有风险。
更重要的是,对于普通读者来说,它并不明显,这是一个问题。如果您打算它是一个静态/全局锁,那么这等同于您的代码,但更明显并且没有无关代码偶然获取锁的风险:
static readonly object readyCountLock = new object();
...
lock(readyCountLock) {...}
有了这个,至少它在做什么是显而易见的。
不过,就个人而言,我很想只使用 Interlocked.Increment(ref _someField)
:)
关于c# - 为什么 lock ("myLock") 会导致问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019361/