「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java における静的と揮発性: それぞれが必要になるのはどのような場合ですか?

Java における静的と揮発性: それぞれが必要になるのはどのような場合ですか?

2024 年 11 月 10 日に公開
ブラウズ:924

Static vs Volatile in Java: When Do You Need Each?

Java の静的と揮発性: マルチスレッド アプリケーションの違いを明確にする

Java では、静的と揮発性の概念が重要な役割を果たします。変数のスコープとスレッド全体の可視性を制御します。これらの用語は置き換え可能に見えることがよくありますが、実際にはアプリケーションのパフォーマンスと正確性に影響を与える異なる動作を示します。

静的と揮発性とは何ですか?

  • 静的 変数は、スレッド コンテキストの数に関係なく、クラスのすべてのインスタンス間で共有されます。各クラスには、特定の名前の静的変数が 1 つだけあります。一方、
  • Volatile 変数は、すべてのスレッドから見えることが保証されています。ただし、静的変数とは異なり、クラスの各インスタンスには volatile 変数の独自のコピーがあります。

Volatile != Static

よくある誤解の 1 つは、次のとおりです。 volatile は、すべてのスレッドにわたる変数の単一コピーを意味します。しかし、そうではありません。 Volatile は、他のスレッドからの更新を潜在的に待つのではなく、スレッドローカルのキャッシュ コピーが即時にフラッシュされることのみを保証します。

静的変数はすべてのスレッドからアクセスできる場合がありますが、それはスレッドによってローカルにキャッシュされないという意味ではありません。これにより、スレッドのローカル キャッシュに古い値が含まれる状況が発生する可能性があります。

Volatile を使用する理由

一方、静的変数は、すべてのスレッド間でデータを共有するのに役立ちます。クラスの場合、マルチスレッドのシナリオでは問題が発生する可能性があります。適切に同期しないと、複数のスレッドが静的値にアクセスすると、データが破損する可能性があります。

Volatile 変数は、このような同時実行性の問題を回避する方法を提供します。変数を volatile として宣言すると、スレッドがキャッシュされた値に依存せず、常にグローバル値を読み取るように強制されます。

静的と揮発性を使用する場合

  • クラスのすべてのインスタンス間で単一の共有値が必要な場合は、static を使用します。
  • 使用volatileは、キャッシュせずに更新されることが保証されている、スレッド間で表示される単一の値が必要な場合に使用します。
  • すべてのスレッド間で値を共有したい場合は、static volatileを使用します。

注意: Volatile は、同期

volatile は可視性を保証しますが、アトミック性やスレッドセーフな操作は保証しません。同期操作が必要なタスクの場合は、ロックや AtomicInteger クラスなどの適切な同期プリミティブを使用する必要があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3