C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のvolatileキーワードとは?マルチスレッドでの使い方を解説

C#のvolatileキーワードとは

C#では、複数のスレッドが同じ変数へ同時にアクセスすることで発生する競合状態(レースコンディション)を軽減するために、volatileキーワードを使用できます。volatileを付けた変数は、コンパイラによるキャッシュなどの最適化が抑制され、常にメモリ上の最新の値が読み書きされることが保証されます。

volatileの基本的な使い方

publicな変数にvolatileキーワードを付ける例は以下の通りです。

class Program {
    public volatile int a;
    public Program(int _a) {
        a = _a;
    }
}

静的変数での使用例

次に、2つの静的変数を用意し、新しいメソッド内で値を設定する例を見てみましょう。

_out = "Welcome!";
_new = true;

これらの変数は、volatileを使用する前にstaticとして宣言しておきます。

static string _out;
static volatile bool _new;

スレッドでメソッドを実行する

続いて、このメソッドを別スレッド上で実行します。

new Thread(new ThreadStart(volatileFunc)).Start();

volatile変数の値を読み取る

最後に、volatile変数の値を読み取ります。

if (_new) {
    Console.WriteLine(_out);
}

volatile使用時の注意点

volatileは変数の可視性(最新値の反映)を保証するものですが、複数の操作をまとめた原子性(アトミック性)までは保証しません。インクリメントのように読み取りと書き込みを伴う処理には不十分な場合があるため、そのようなケースではInterlockedクラスやlockステートメントの利用を検討しましょう。

  1. Javaのvolatileとtransientキーワードの違いを徹底解説

    Javaには、それぞれ異なる目的で使われるvolatileとtransientという2つの修飾子があります。名前は似ていますが、役割はまったく別物です。この記事では、両者の違いをわかりやすく解説します。volatileキーワードとはvolatileは、主にマルチスレッド環境で使用されるキーワードです。複数のスレッドが同じ変数に対して同時に読み書きを行う場合、通常はCPUキャッシュに値が保持されるため、スレッド間で値の不整合が発生する可能性があります。volatileを付けた変数は、変更内容がCPUキャッシュを経由せずメインメモリに直接反映されるため、すべてのスレッドが常に最新の値を読み取ること

  2. Javaのthisキーワードでstaticメンバーは参照できる?理由とサンプルコードを解説

    いいえ、thisキーワードを使ってクラスのstatic(静的)メンバーを参照することはできません。その理由は、thisキーワードが「現在のオブジェクト(インスタンス)」を指すのに対し、staticメンバーはクラス自体に属しており、オブジェクトなしで呼び出し可能だからです。つまり、Javaではstaticメンバーはインスタンスを生成しなくても、クラス名を通じて直接アクセスできます。なぜthisとstaticは組み合わせられないのかstaticメソッドやstaticブロックの中でthisを使用すると、コンパイルエラーが発生します。これは、staticなコンテキストにはインスタンスが存在しないため、