クラスConcurrentThread { / ** *分析のスレッドが同時にアクセスコードは理由を説明します * volatileキーワード: * 1):変数のスレッドの修正値は、この変数の操作、異なるスレッドが、他のスレッドにこの新しい値が直ちに表示されているときの視認性を確保するため * 2):禁止命令の並べ替え *揮発性は、本質的にレジスタにJVM現在の変数の値を伝えます(ワーキングメモリ)は、定かではメインメモリから読み出される必要があります * / プライベート 揮発 int型のカウント= 0 ; 公共 のボイドINC(){ しようと{ Thread.sleep( 3 )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } カウント ++ ; } @オーバーライド パブリック文字列のtoString(){ リターン "[カウント=" +カウント+ "]" 。 } } // ---------------------------------------- パブリック クラスVolatileTest { 公共 静的 ボイドメイン(文字列[]引数){ 最終 ConcurrentThreadカウンタ= 新しいConcurrentThread()。 以下のために(INT I = 0; I <1000; I ++ ){ 新しいスレッド(新しいRunnableを(){ @オーバーライド 公共 のボイドの実行(){ counter.inc(); } })。開始(); } System.out.println(カウンタ) } }
reason説明:Javaのメモリモデルを実行している各スレッドのスレッドスタックがありますが、スレッドスタックは、スレッドが実行して保持しているとき、変数情報の価値
オブジェクトは、スレッドのアクセス時間の価値があるときは:
図1に示すように、参照によりヒープメモリ変数オブジェクトに対応する値を見つけます
スレッドローカルメモリに2、ヒープメモリ変数の特定の負荷値、変数のコピーを構築していない、とヒープメモリの変数の値に任意の関係オブジェクトを持っていますが、直接変数のコピーの値を変更し、もはやスレッド、修正一定時間後(スレッドが終了する前に)、自動的にコピーは、変数のスレッドの値をヒープ変数上のオブジェクトに書き戻されます。ヒープ内のようなオブジェクトの値が変化をもたらすでしょう。
主な機能1000のサブスレッドを開く上方言うことである上記の例と組み合わせ、各変数のコピー有する糸の端と、その後に書かれた値を変更する場合、各スレッドは変数のみ一時的にコピーを変更し、変更しますメインメモリに結果が1000に等しいこと、および通常1000未満することはできませんので、そう、セキュリティスレッド(廃止された変数メインメモリの値を取得する)がありました。