以下对象线程是否安全?

Jas*_*per 4 .net c# multithreading

以下对象线程是否安全?我将创建一个实例并使用两个或多个线程来使用它,这是一个很好的方法来解决这个问题吗?

public class ASyncBuffer<T>
{
    readonly object _locker = new object();
    private T _value;
    private bool _dirty;

    public T GetValue()
    {
        lock (_locker)
        {
            _dirty = false;
            return _value;
        }
    }

    public void SetValue(T value)
    {
        lock (_locker)
        {
            _dirty = true;
            _value = value;
        }
    }

    public bool Dirty
    {
        get
        {
            lock (_locker)
            {
                return _dirty;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*lje 7

对象本身是线程安全的,但请确保您也考虑使用它.例如,如果您的用法如下所示:

if ( buffer.Dirty ) {
   var obj = buffer.GetValue();
}
Run Code Online (Sandbox Code Playgroud)

这种用法不是线程安全的,因为它的值Dirty可能会在您检查它和实际获取值之间发生变化.

要避免这个问题(并尽量少使用锁定),您可能希望像以下一样使用它:

if ( buffer.Dirty ) {
   lock(buffer) {
      if ( buffer.Dirty ) {
         var obj = buffer.GetValue();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)