Thread.VolatileRead / Write()は絶対に使用しないでください。これは.NET1.1の設計ミスであり、完全なメモリバリアを使用しています。これは.NET2.0で修正されましたが、これらのメソッドを修正できなくなり、System.Threading.Volatileクラスによって提供される新しい方法を追加する必要がありました。これはジッターが認識しているクラスであり、jit時にメソッドを特定のプロセッサタイプに適したバージョンに置き換えます。
リファレンスソースから入手できるVolatileクラスのソースコード内のコメントは、物語を物語っています(適合するように編集されています)。
// Methods for accessing memory with volatile semantics. These are preferred over
// Thread.VolatileRead and Thread.VolatileWrite, as these are implemented more
// efficiently.
//
// (We cannot change the implementations of Thread.VolatileRead/VolatileWrite
// without breaking code that relies on their overly-strong ordering guarantees.)
//
// The actual implementations of these methods are typically supplied by the VM at
// JIT-time, because C# does not allow us to express a volatile read/write from/to
// a byref arg. See getILIntrinsicImplementationForVolatile() in jitinterface.cpp.
そして、はい、あなたはその使用法の例を見つけるのに苦労するでしょう。リファレンスソースは、スレッド化を処理する、注意深く記述され、テストされ、戦いで傷ついたC#コードのメガバイトを含む優れたガイドです。VolatileRead / Writeを使用する回数:ゼロ。
率直に言って、.NETメモリモデルは、CLR mmとC#mmによって行われた矛盾する仮定と、最近ARMコアに追加された新しいルールを伴う混乱です。アーキテクチャごとに異なることを意味するvolatileキーワードの奇妙なセマンティクスは、その証拠です。弱いメモリモデルを備えたプロセッサの場合、通常、C#言語仕様の内容は正確であると想定できます。
ジョー・ダフィーはすべての希望をあきらめ、それをすべて使用することを思いとどまらせていることに注意してください。一般に、言語とフレームワークによって提供されるプリミティブよりも優れた結果が得られると想定するのは非常に賢明ではありません。VolatileクラスのRemarksセクションは、ポイントを持ち帰ります。
通常の状況では、C#lockステートメント、Visual Basic SyncLockステートメント、およびMonitorクラスは、データへのアクセスを同期する最も簡単でエラーが発生しにくい方法を提供し、Lazyクラスは、直接使用せずに遅延初期化コードを記述する簡単な方法を提供します。ロックを再確認しました。