挥发性是一种很好的做法,可以避免C#中的竞争条件?

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更好.

在这种特定情况下,如果此时服务不可用,则不需要等待它再次可用.

Ade*_*mak 6

不,这还不够.易失性不足以管理多线程,实际上,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)