汎用フィールドとそれをカプセル化するプロパティがあります。
T item;
public T Item
{
get { return item; }
set { item = value; }
}
問題は、このプロパティが1つのスレッドから書き込まれ、同時に複数のスレッドから読み取られる可能性があることです。また、T
がstruct
、またはの場合long
、読者は一部が古い値で一部が新しい値の結果を取得する可能性があります。どうすればそれを防ぐことができますか?
を使用してみ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);
}
}
これはうまくいくでしょうが、それは単純なはずの何かに対する過度に複雑な解決策であるように私には思えます。
パフォーマンスは重要であるため、可能であれば、ロックは回避する必要があります。
set
と同時に発生した場合、古い値を返すか新しい値を返すget
かは関係ありません。get