http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3.1.4volatileの例(JLS8/8.3.1.4 volatileフィールドのもの)が動作しませんか?
Java言語仕様8/8.3.1.4揮発性のフィールド
質問:
揮発性の例では、私は実行しないようにする方法two()
に同期したキーワードを追加方法two()
中のone()
。
でも、私はまだj
がi
より大きいことに気付きました。なぜですか?
注:
私は、Java HotSpotの1.8.0_112を使用しています。
If you can not noticed j is larger than i, please set testVolatile()/num to a larger number.
私のデモ:
public class VolatileDemo {
static volatile int i = 0, j = 0;
static void one() {
i++;
j++;
}
static synchronized void two() {
if (i != j)
System.out.println("i=" + i + " j=" + j);
}
static void testVolatile() {
int num = 5000;
for (int i = 0; i < num; i++) {
new Thread(new Runnable() {
public void run() {
one();
}
}).start();
}
for (int i = 0; i < num; i++) {
new Thread(new Runnable() {
public void run() {
two();
}
}).start();
}
}
public static void main(String[] args) {
testVolatile();
}
}
マイ結果:
I = 4996 J = 4998
I = 4998 J = 5000
I = 4998 J = 5000
....
両方のメソッドには、同時実行を防ぐためにsynchronizedキーワードを設定する必要があります。 – qwerty
ありがとう、私はこれがアプローチの1つであることを知っています。Javaは、いくつかの目的のためにロックするよりも便利な第2のメカニズム、揮発性フィールドを提供しています。 – Zenna