我有一个通用字段和一个封装它的属性:
T item;
public T Item
{
get { return item; }
set { item = value; }
}
问题是这个属性可以从一个线程写入并同时从多个线程读取。如果T
是struct
, or long
, 读者可能会得到部分旧值和部分新值的结果。我怎样才能防止这种情况?
我尝试使用volatile
,但这是不可能的:
volatile 字段不能是“T”类型。
由于这是我已经编写的代码的一个更简单的例子,它使用ConcurrentQueue<T>
,所以我也考虑在这里使用它:
ConcurrentQueue<T> item;
public T Item
{
get
{
T result;
item.TryPeek(out result);
return item;
}
set
{
item.TryEnqueue(value);
T ignored;
item.TryDequeue(out ignored);
}
}
这会起作用,但在我看来,对于应该简单的事情来说,它是过于复杂的解决方案。
性能很重要,因此,如果可能,应避免锁定。
如果 aset
与 同时发生get
,我不在乎get
返回旧值还是新值。