Luk*_*vac 1 .net c# multithreading thread-safety
我想知道在特定情况下是否像这样,我们有bool标志,表明是否有一些服务可用:
private bool isAvailable;
private void foo()
{
if(isAvailable)
{
isAvailable = false;
DoSomething();
isAvailable = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在多线程环境中将bool字段设置为volatile是否足够,或者使用锁甚至是Monitor更好.
在这种特定情况下,如果此时服务不可用,则不需要等待它再次可用.
不,这还不够.易失性不足以管理多线程,实际上,volatile可能会增加预期结果与实际结果之间的差距.访问变量(isAvailable)并修改它仍然会导致竞争条件.您可以使用锁定,信号量或原子操作来管理多线程操作.
private object myLock = new object;
private void foo()
{
lock(myLock)
{
DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
要么
[MethodImpl(MethodImplOptions.Synchronized)]
private void foo()
{
// DoSomething
}
Run Code Online (Sandbox Code Playgroud)
@Fildor是对的.我想念问题,因此,我编辑了我的答案.下面的代码,如果资源没有被锁定,代码锁定资源并做一些事情,否则它跳过关键部分.
private object myLock = new object;
private void foo()
{
if (Monitor.TryEnter(lockObject))
{
try
{
//do something
}
finally
{
Monitor.Exit(lockObject);
}
}
}
Run Code Online (Sandbox Code Playgroud)