Javaキーワードvolatileのインスタンス分析


ネット上で多くのvolatileに関する文章を探して、ずっとvolatileの作用を体現するコードの例を見つけていないで、本文はコードを通じてみんなにvolatileの作用を紹介します.不正な点があれば,批判と指摘を歓迎する.
例1:
public class TestWithVolatile {
    private volatile static boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    if (bChanged == !bChanged) {
                        System.out.println("!=");
                        System.exit(0);
                    }
                }
            }
        }.start();

        Thread.sleep(1);

        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();
    }
}

これはネット上で探した1段の例で、无数の猿类に喷かされて、みんなは次々と“volatile”の结果をプラスしないと言ってすべて同じで、スレ主はプログラムを検証していないでコードを贴り出して、私は工事runを建ててこのコード、确かにみんなが言ったように、“volatile”をプラスしないですべて出力します!=”.そこで自分で引き続きインターネットを利用して资料を探して、volatileの作用を说明することができるコードを探して、何気なく“マルチスレッドの环境の下で、volatileはスレッドが最新のデータを得ることを保证することができます”マルチスレッドのこのいくつかの字は私の心の中できらめいて、そこで私は上の例のコードを改造し始めました
例2:
public class TestWithVolatile {
    private static volatile boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        for(int i = 0; i < 10; i++){
            new Thread() {
                @Override
                public void run() {
                    for (;;) {
                        if (bChanged == !bChanged) {
                            System.out.println("!=");
                            System.exit(0);
                        }
                    }
                }
            }.start();
        }

        Thread.sleep(1);

        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();
    }
}

私は10個の判定条件をするスレッドを起動して、runはコードを打って、この時volatileの作用は体現して、volatileのコードをプラスしないでずっと運行状態から、volatileのコードをプラスしてすぐexitになりました.volatileの役割を感じて、それからコードを調整しました.
例3:
public class TestWithVolatile {
    private static volatile boolean bChanged;

    public static void main(String[] args) throws InterruptedException {
        new Thread() {
            @Override
            public void run() {
                for (;;) {
                    bChanged = !bChanged;
                }
            }
        }.start();

        Thread.sleep(1);

        for(int i = 0; i < 10; i++){
            new Thread() {
                @Override
                public void run() {
                    for (;;) {
                        if (bChanged == !bChanged) {
                            System.out.println("!=");
                            System.exit(0);
                        }
                    }
                }
            }.start();
        }
    }
}

私は10の判定条件のスレッドをコードの後ろに移動して、runコード、“volatile”をプラスしないですべて速いexitプログラムを加えることができることを発見します.
どうしてこんなことになったの?以下は私の推測例2である:まず10スレッドを確立し、同時にbChangedの値を取得する.これはvolatileが役割を果たし、個のスレッドに最新の値を取得させることができる.例3:bChanged値を設定してからbChangedの値を取得し、forループでスレッドを作成し、最初のスレッドを作成することは、例1のコードに相当し、完全なスレッドを作成していない場合に、最初に作成したスレッドがexitプログラムになっている可能性があります.したがって、volatileを追加しても追加しても実行結果は同じです.みんなに分かち合います.