Javaのメモリモデルでは、たまたま、前に理解すべきである:前の操作からの結果は、それが次の動作、すなわちメモリの可視性を取得してもよいです。
メモリ・マルチスレッドの視認性の問題を解決するために、事前発生原理、スレッド間でこれらの原則を遵守するように、最適化コンパイラはまた、特定の制約されてきた提案しました。
以下の原理要素は次のとおりです。
1、プログラムシーケンスのルール
スレッド内で、コード実行の一部の結果が順序付けられます。命令は、まだ再配置されますが、どんなに並べ替え、結果は変わりませんコードの順に従って生成されません。
図2に示すように、チューブロックルール
マルチスレッド環境で、シングルスレッド環境や、同じロックのために、一つのスレッドのロックのロックを解除した後、別のスレッドがロックを取得し、あなたが前にスレッドの操作の結果を見ることができます両方。
3、揮発性変数のルール
スレッドがvolatile変数を書く行き場合、スレッドはこの変数を読み取るために、その後、書き込み操作の結果は、このスレッドを読むことが見えなければなりません。
4、スレッド開始ルール
メインスレッドで実行される処理は、プロモータースレッドBは、次いで、プロモーターが修飾Bのスレッドで共有変数をスレッドBの前に表示されているスレッド。
5、スレッドは、ルールを終了します
メインスレッドで実行される処理は、サブ終了スレッドBが、スレッドBへの変更は、スレッドAを終了する前に、共有変数に表示され
6、糸切れルール
割り込みスレッド()メソッドの呼び出しは、最初にあなたが(は)割り込みがThread.interruptedを介して行われたか否かを検出することができ、イベントが発生し中断し、中断スレッドコード検出で発生しました。
図7に示すように、転送ルール
前起こる原理、すなわち、Aが発生し、前にBを、Bが発生する前に-C、次いでAが発生し、前にC、推移的です
図8に示すように、物体側のルール
初期化完了がオブジェクトである、すなわち、エンドが発生し、前に行わコンストラクタ()メソッドを終了しなければなりません