Volatile と static は、Java の 2 つの重要な修飾子であり、異なるスレッド間での値の共有を管理する際に重要な役割を果たします。そしてオブジェクト。どちらも変数のスコープに影響しますが、マルチスレッド アプリケーションに対する影響は異なります。
変数を静的として宣言すると、変数に関係なく、変数のコピーが 1 つだけ存在することが保証されます。作成されたクラス インスタンスの数。これは、すべてのスレッドとオブジェクトが静的変数の同じ共有コピーにアクセスすることを意味します。ただし、スレッドは、静的変数の値のローカルにキャッシュされたコピーを維持する場合があります。
静的変数とは異なり、変数が静的ではなく揮発性として宣言されている場合、各オブジェクトは変数の独自のコピーがあります。一見すると、これは通常の変数と同じように見えます。ただし、揮発性変数は、スレッドが値をローカルにキャッシュすることも妨げます。
マルチスレッド環境では、値がキャッシュされる可能性が課題を引き起こします。変数が volatile として宣言されていない状態で、2 つのスレッドが同じオブジェクトの変数を同時に更新すると、一方のスレッドのキャッシュ値が古くなる可能性があります。
この問題を防ぐには、変数を static volatile として宣言すると、スレッドがグローバル変数を読み取るように強制されます。
volatile はスレッドでの変数値の可視性を保証しますが、適切な同期の代わりにはなりません。たとえば、次のコードは依然として競合状態により不正確な結果を引き起こす可能性があります:
private static volatile int counter = 0; private void concurrentMethodWrong() { counter = counter + 5; // do something counter = counter - 5; }
このような問題を解決するには、ロックや AtomicInteger クラスなどの同期メカニズムを実装して、アトミックを保証することが不可欠です。共有変数の更新。
以上がマルチスレッド Java アプリケーションでは、揮発性変数と静的変数はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。