レンタルvolatileキーワードを構築するために、信用のJavaのマルチスレッドおよびディスクメモリバリア

揮発性の同期​​メカニズムは、レンタルディスクQを構築するためにクレジットを提供する最も軽量JVMの一つである[1152880099]のJavaメモリモデルは、揮発性であるため、特別なアクセスルールの定義、Javaのメモリモデルに2つの主要な機能を達成することが可能となる:可視性そして、秩序。そのためvolatileキーワードのこれら2つのプロパティを持っているので、私たちは、volatileキーワードが複数のスレッドのいくつかの同期を解決することができます。

1、揮発性視認性
揮発性視認性は、変数が修正後の揮発性である場合、この変数は、すべてのスレッドから見えることを意味します。そのポイントの方言は、スレッドがvolatile変数を変更すると、他のスレッドは、この変数の最新の値を取得し、この変数を変更し、すぐに知ることができます。

記事と併せて前述のJavaメモリモデルのスレッド、ワーキングメモリとのインタラクティブな関係、メインメモリ、私たちは、揮発性の可視性をvolatile変数として定義されて理解することができ、スレッドに書き込み値がワーキングメモリにキャッシュされませんが、直接変更された値に戻し、メインメモリリフレッシュに書き込まれ、他のスレッドの変更のメインメモリ内の変数のメモリアドレスへの監視プロセッサは、これらを行いますときワーキングメモリにこの変数の最新の値のメインメモリコピーに再びスレッドではなく、古いワーキングメモリキャッシュを継続して使用します。

私は揮発性、視認性の使用をリストしたの下には、マルチスレッド安全な例を解決します:

パブリッククラスVolatileDemo {//プライベート静的ブール isReady = falseは、プライベート静的揮発性ブール偽= isReady;(!isReady)静的クラスReadyThreadは、Thread {公共ボイドラン(){}中{System.out.printlnは( "ReadyThread仕上げ"を拡張);}}パブリック静的な無効メイン (文字列[]引数)InterruptedExceptionある{新しいReadyThread()開始();.のThread.sleep(1000)スロー; //スリープ1 秒のスレッドが既に真ReadyThread isReady =を確保するために開始しました;} }
上記のコードを実行した後、最終的には、コンソールに出力されます:ReadyThread仕上げ、そしてあなたの後に実行すると、プログラムが終了せずに実行されたことがわかりますvolatile修飾子isReady変数を削除しますが、何も印刷出力コンソールはありません。

私たちは、このプログラムの下で分析した:最初にReadyThreadが開始した後、スレッドが起動するようisReadyは、偽のコードブロックフラグがある一方、偽のisReadyが無限ループ、揮発性のキーワードで変更isReady、mainメソッドスレッドに入りますので、それはです修正isReadyが真の後、ReadyThreadスレッドがすぐに通知され、サイクル、最終プリントアウト関連するテキストを終了しますwhileループが続く最新isReady値を取得します。揮発性の修正を使用しない場合は、mainメソッドがあるがisReady変数を変更しますが、ReadyThreadスレッドがこの変更を認識していないスレッドなので、古い値または使用前に、そのためには、常にwhile文無限ループを実行します。

おすすめ

転載: www.cnblogs.com/xihuankan/p/11027017.html