gpt4 book ai didi

c# - 以下对象线程安全吗?

转载 作者:太空狗 更新时间:2023-10-30 01:08:38 28 4
gpt4 key购买 nike

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

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;
}
}
}
}

最佳答案

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

if ( buffer.Dirty ) {
var obj = buffer.GetValue();
}

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

为避免该问题(并尽量减少使用锁定),您需要像这样使用它:

if ( buffer.Dirty ) {
lock(buffer) {
if ( buffer.Dirty ) {
var obj = buffer.GetValue();
}
}
}

关于c# - 以下对象线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com