我想知道在像这样的特定情况下,我们是否有指示某些服务是否可用的 bool 标志:
private bool isAvailable;
private void foo()
{
if(isAvailable)
{
isAvailable = false;
DoSomething();
isAvailable = true;
}
}
在多线程环境中将 bool 字段设置为 volatile 是否足够,还是使用锁甚至 Monitor 更好。
在这种特定情况下,如果该服务目前不可用,则无需等待它再次可用。
最佳答案
不,这还不够。 volatile 不足以管理多线程,实际上,volatile 可能会增加预期结果与实际结果之间的差距。访问变量 (isAvailable) 并修改它仍然会导致竞争条件。 您可以使用锁、信号量或原子操作来管理多线程操作。
private object myLock = new object;
private void foo()
{
lock(myLock)
{
DoSomething();
}
}
或
[MethodImpl(MethodImplOptions.Synchronized)]
private void foo()
{
// DoSomething
}
@Fildor 是对的。我想念问题的概念,因此,我编辑了我的答案。下面的代码,如果资源没有被锁定,代码锁定资源并做一些事情,否则它跳过临界区。
private object myLock = new object;
private void foo()
{
if (Monitor.TryEnter(lockObject))
{
try
{
//do something
}
finally
{
Monitor.Exit(lockObject);
}
}
}
关于c# - volatile 是避免 C# 中竞争条件的好做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49650747/