それが更新されますマルチスレッドのワーキングメモリ上

変数定義されたアクセスルールに使用JMMプログラム、発生するメモリアクセス、ハードウェアとシステムの違いを遮断したい人の定義。

すべての変数がより多くのメインメモリがあり、空のJMMはまた、ワーキングメモリの概念を述べた時に、各スレッドは、独自のワーキングメモリを持って見ている前に、メモリストレージを作業は、作業、メインメモリにコピーのコピーを使用する変数さまざまなスレッドですメモリは、直接、直接メインメモリ変数を操作しないで、各スレッドのみ仕事スレッド変数を操作することができるように、メインメモリの中間によって媒介されると、他のワーキングメモリ変数との間で動作することができません。

次いで、アトミックオペレーションの定義がある。8、書き込み、変数、すなわち読み取り、ロックアンロック、負荷、使用、割り当て、格納を制御します。

これは、8つのルールを定義します

1変数は、同じスレッドが複数回ロックすることができ、一つのスレッドロックすることができ、繰り返しの後ろに、ロック解除に対応するリエントラントであると言います。

2lock変数の後、最初に彼らのワーキングメモリをクリアし、使用するときに、メインメモリからリロードし、ロックを解除した後、メインメモリに同期させます。

メインメモリに定義された唯一の3つの変数、ユーザ使用前に、またはロードするまたはストアアサイン

変更されなかった4つのワーキングメモリ変数、何の理由ではない同期メインメモリは、同期メインメモリいったん変更してくださいません。

これらは基本です。「Java仮想マシンの深い理解」からの抜粋

 

我々は同時にフィールドオブジェクトを操作する二つのスレッドに遭遇したとき、私たちはいくつかの問題に遭遇し、

最初のコードを掲載

パブリッククラスMyObjectに{ 
プライベート文字列名=「1」;
プライベート文字列のパス=「11」;

公共ボイドプリント(){
System.out.printlnは(名前+」「+パス);
}

公共ボイドのsetValue(文字列U、列P){
this.name = U。
(。。にThread.currentThread()のgetName()に等しい( "A")){場合
のSystem.out.println( "停止")。
Thread.currentThread()(一時停止)。
}
this.pass = P。
}
}
パブリッククラスTest { 
パブリック静的な無効メイン(文字列[] args)は例外{スロー
最終MyObjectにオブジェクト=新しいMyObjectには();
スレッド2スレッド=新しいスレッド(){
@Override
ます。public void実行(){
ながら、(真){
object.print();
{試す
のThread.sleep(1000);
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}
}
}
}。
thread2.start();

=新しいスレッド(){スレッド1、スレッド
@Overrideを
RUNボイドパブリック(){
object.setvalue( "A"、 "AA");
}
};

thread1.setName( "A");
thread1.start();
のThread.sleep(500);

//thread2.start( );

}

説明:スレッド1スレッド2と同時に対象物を操作します、
スレッド2の操作後、出力がスレッド1が起動した後、それはこの時間スレッド2ループの出力が変更され、オブジェクトフィールドの値を変更し、および11になってします、1および11である

:熟考
1つの各スレッドはそれ自身を持っていますワーキングメモリ、オブジェクト(フィールド1、11)と1つのコピースレッド1のそれぞれの作業メモリスレッド2、最初のフィールド出力スレッド2(1、11)理解することができる標的とします。
ワーキングメモリ(11)にオブジェクトフィールドのスレッド1の変更を開始したとき2しかし、
3は続い
スレッド2出力フィールドは、(11)となっている
ので、接続配慮が自分のワーキングメモリを持っていませんワーキングメモリ変数スレッド2スレッドも失わになることができ、なぜ、ああ停止しなかったスレッドスレッド1。

以下は私の意見では
、サスペンド()メソッドは、メインメモリに同期されますスレッド1スレッド、および睡眠は()が真です。
ワーキングメモリのスレッドスレッド2に同期メインメモリどのように次のステップがあり

、この意見は他の誰かで
パフォーマンスを向上させるためには、読まれていないメモリをワーキングスレッドなので、メインメモリのデータへのアクセスが高速化することができ、があります。スレッド共有変数が変更された後、スレッドと他のスレッドにワーキングメモリの値が矛盾し、メインメモリの値も一貫性がなくなりますので、あなたは、この他のスレッドブラシに、おそらくメインメモリにワーキングメモリの値を磨くする必要がありますが、私は見ませんでした。
共有変数を読み込むときに、コマンド障壁必須読み取りが書き込み動作後に発生し、CPU、および他のスレッドによって揮発性を利用した後は、揮発性、自分のワークメモリの値をクリーンアップし、代わりにメインメモリから再読み込みする必要があります我々はリフレッシュしましょうことを保証するが、必ずしもそうではない、他の目に見えない糸を書いていません。

それは必ずしも、ではない、voliatileことなく、他のスレッドが必ずしも表示されていない、ランダムがあります。プラス特定の外観は、参照してください。
これは、現在、私の理解です。



おすすめ

転載: www.cnblogs.com/xlblog/p/11520793.html