Javaキーワードvolatileのインスタンス分析
ネット上で多くのvolatileに関する文章を探して、ずっとvolatileの作用を体現するコードの例を見つけていないで、本文はコードを通じてみんなにvolatileの作用を紹介します.不正な点があれば,批判と指摘を歓迎する.
例1:
これはネット上で探した1段の例で、无数の猿类に喷かされて、みんなは次々と“volatile”の结果をプラスしないと言ってすべて同じで、スレ主はプログラムを検証していないでコードを贴り出して、私は工事runを建ててこのコード、确かにみんなが言ったように、“volatile”をプラスしないですべて出力します!=”.そこで自分で引き続きインターネットを利用して资料を探して、volatileの作用を说明することができるコードを探して、何気なく“マルチスレッドの环境の下で、volatileはスレッドが最新のデータを得ることを保证することができます”マルチスレッドのこのいくつかの字は私の心の中できらめいて、そこで私は上の例のコードを改造し始めました
例2:
私は10個の判定条件をするスレッドを起動して、runはコードを打って、この時volatileの作用は体現して、volatileのコードをプラスしないでずっと運行状態から、volatileのコードをプラスしてすぐexitになりました.volatileの役割を感じて、それからコードを調整しました.
例3:
私は10の判定条件のスレッドをコードの後ろに移動して、runコード、“volatile”をプラスしないですべて速いexitプログラムを加えることができることを発見します.
どうしてこんなことになったの?以下は私の推測例2である:まず10スレッドを確立し、同時にbChangedの値を取得する.これはvolatileが役割を果たし、個のスレッドに最新の値を取得させることができる.例3:bChanged値を設定してからbChangedの値を取得し、forループでスレッドを作成し、最初のスレッドを作成することは、例1のコードに相当し、完全なスレッドを作成していない場合に、最初に作成したスレッドがexitプログラムになっている可能性があります.したがって、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を追加しても追加しても実行結果は同じです.みんなに分かち合います.