メモリ モデルとは何ですか?なぜ必要ですか?

零下一度
リリース: 2017-06-25 10:32:56
オリジナル
2158 人が閲覧しました

JAVA メモリ モデル

このシリーズのマルチスレッドでは、基礎となるメモリ モデルについては詳しく説明しません

1. メモリ モデルとは何か、なぜそれが必要なのか

最新のマルチコア プロセッサでは、各プロセッサが独自のメモリ モデルを持っています。メインメモリと定期的に調整される独自のキャッシュ

各プロセッサがいつでも他のプロセッサが何をしているかを確実に把握するには、多くのオーバーヘッドが必要ですが、通常は不要です

スレッド間でデータを共有する場合にのみ必要です。情報を知るため; JAVAでは、それは正しい同期によって達成されます

1. 並べ替え

モデルの紹介

部分的な順序関係:ただし、任意の2つの要素AとBに対して。 , AがBに偏る、またはBがAに偏るという関係を必ずしも満たすわけではありません

例:AとBの間ではBの方が好きですが、明示的に選択する必要はありません

JMMは部分的な順序関係を定義しますプログラム内のすべての操作に対して、Happens-Before と呼ばれます。操作 B を実行しているスレッドが操作 A の実行を確認するようにしたい場合は、AB が同じスレッド内にあるかどうかに関係なく、スレッドの結果が Happens-Before を満たす必要があります。関係の前、それ以外の場合、JVM はそれを並べ替えます

例: ロック操作、複数のスレッド間で実行順序を予測できます 時間は Happens-Before と一致します ロックがなければ、を判断することは不可能です。スレッド間のスケジューリング

3. 解放

本当の理由: 命令の並べ替えにより、共有オブジェクトの公開と別のスレッドでのオブジェクトへのアクセスの間には発生しません。正しく構築され、リリースされました

public class PossibleReordering {static int x = 0, y = 0;static int a = 0, b = 0;/** * 判断输出值将会非常困难:
     * 1:多线程之间的切换,导致可能的输出值:(0,1)(1,0)(1,1)
     * 2.指令重排序:one线程如a=1和x=b之间重排序,x=b(0),然后other线程被调度执行y=a(0),将导致(0,0)     */public static void main(String[] args) throws InterruptedException {
        Thread one = new Thread(new Runnable() {public void run() {
                a = 1;
                x = b;
            }
        });
        Thread other = new Thread(new Runnable() {public void run() {
                b = 1;
                y = a;
            }
        });
        one.start();
        other.start();
        one.join();
        other.join();
        System.out.println("( " + x + "," + y + ")");
    }
}
ログイン後にコピー

以上がメモリ モデルとは何ですか?なぜ必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート