以下のコードは、私が達成しようとしていることの非常に単純化された例です。
private object _highestLevelLock = new object();
private int _highestValue;
private void SetHighestValue()
{
var random = new Random();
var next = random.Next(0, 100);
if (next > _highestValue)
{
lock (_highestLevelLock)
{
if(next > _highestValue)
_highestValue = next;
}
}
}
つまり、これまでに遭遇した最大の整数を保持する変数があります。SetHighestValue() は、複数のスレッドからアクセスできます。
生成されたランダムな整数が現在最大の整数よりも大きい場合、_highestValue を更新します。
私の質問は、next>highestValue の場合に 2 回チェックしないようにするにはどうすればよいですか? ロック内から削除すると、このスレッドが値を設定する前に _highestValue がさらに高い値に設定されるリスクがあり、このシナリオでは _highestValue が不正確になります。
ロックの外側にある if ステートメントを削除できることはわかっていますが、不必要にロックしたくありません。
これを達成するためのより良い方法はありますか?ロックおよび/またはインターロックされた名前空間の使用の潜在的な組み合わせ?
やや関連する注意事項として、_highestValue は揮発性である必要がありますか? たとえそうであったとしても、当面の私の質問には役立たないと思います。
ありがとう!