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)
对象本身是线程安全的,但请确保您也考虑使用它.例如,如果您的用法如下所示:
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)