多くの友人は、キーワードが不安定であると聞いたことがあり、それを使用したかもしれません。 Java 5以前は、プログラムでそれを使用すると予想外の結果が得られるため、物議を醸すキーワードでした。 Java 5が揮発性のキーワードがその活力を取り戻した後にのみ。
揮発性キーワードの機能は、システム内のすべてのスレッドをキーワードによって変更された変数に見えるようにすることであり、揮発性によって変更されたキャッシュされた変数からスレッドのワーキングメモリを禁止することができます。
揮発性2の使用シナリオ:
1。可視性:Javaは、可視性を確保するために揮発性キーワードを提供します。
共有変数が揮発性によって変更されると、変更された値がすぐにメインメモリに更新され、他のスレッドが読み取る必要がある場合、メモリ内の新しい値が読み取られます。
ただし、通常の共有変数は可視性を保証することはできません。これは、通常の共有変数が変更された後にメインメモリに書き込まれる場合が不確実であるためです。他のスレッドがそれを読んだ場合、元の古い値がまだメモリにある可能性があるため、視界を保証することはできません。
さらに、同期とロックは視認性を確保することもできます。同期とロックにより、1つのスレッドのみが同時にロックを取得し、同期コードを実行することを保証できます。ロックを解放する前に、変数の変更がメインメモリに更新されます。したがって、可視性を保証できます。
最初にコードを見てみましょう。スレッド1が最初に実行され、スレッド2が後で実行される場合:
//スレッド1boolean stop = false; while(!stop){dosomething();} //スレッド2stop = true;このコードは非常に典型的なコードであり、多くの人がスレッドを中断するときにこのマークアップ方法を使用する場合があります。しかし、実際、このコードは完全に正しく実行されますか?スレッドは中断されますか?必ずしもそうではありません。おそらく、ほとんどの場合、このコードはスレッドを中断する可能性がありますが、スレッドが中断されない可能性もあります(この可能性は非常に小さくなりますが、これが起こると、死んだループが発生します)。
このコードがスレッドを中断しない理由を説明しましょう。前述のように、各スレッドには操作中に独自の作業メモリがあるため、スレッド1が実行されているときに、停止変数の値をコピーし、独自の作業メモリに配置します。
次に、Thread 2がSTOP変数の値を変更したが、メインメモリに書き込む時間がなかった場合、Thread 2は他のことを実行するために、スレッド1はスレッド2の停止変数への変更について知らないため、ループし続けます。
しかし、揮発性で変更した後、それは異なります:
最初:揮発性キーワードを使用すると、変更された値がメインメモリにすぐに書き込まれます。
2番目:揮発性キーワードを使用すると、スレッド2が変更すると、スレッド1のワーキングメモリのキャッシュ変数ストップのキャッシュラインが無効になります(ハードウェア層に反映されると、CPUのL1またはL2キャッシュの対応するキャッシュラインが無効です)。
第三:スレッド1のワーキングメモリのキャッシュ変数の停止のキャッシュラインは無効であるため、スレッド1は、変数停止の値を再び読み取るときにメインメモリで読み取ります。
次に、スレッド2が停止値を変更すると(もちろん、ここには2つの操作があり、スレッド2のワーキングメモリの値を変更し、メモリに変更された値を書き込みます)、スレッド1のワーキングメモリのキャッシュ変数ストップのキャッシュラインは無効になります。スレッド1が読み取ると、キャッシュラインが無効であることがわかります。キャッシュラインの対応するメインメモリアドレスが更新されるのを待ち、対応するメインメモリの最新値を読み取ります。
次に、スレッド1が読むものは最新の正しい値です。
2。秩序率を確保します
Volatile Boolean initiated = false; //スレッド1:Context = LoadContext();開始= true; //スレッド2:while(!inited){sleep()} dosomethingwithconfig(context);コンテキストが初期化されていることを確認してください。
3.ドゥーブルチェック
クラスSingleton {private Volatic Static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){if(instance == null){synchlonized(singleton.class){if(instance == null)instance = new singleton();}} return Instance;}}}上記は、編集者が紹介したJavaの揮発性キーワードの役割と使用法の詳細な説明です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!