は、一例として、このConcurrentDouble
クラス定義を取る:私は以下、同時実行:非同期のメソッドで変数を変更する
public class Test {
public static void main(String[] args) {
ConcurrentDouble d1 = new ConcurrentDouble();
Thread one = new Thread(() -> { d1.add(5); }).start();
Thread two = new Thread(() -> { d1.subtract(5); }).start();
one.join();
two.join();
System.out.println(d1.num); // <-- OUTPUT
}
}
をしなかった場合
public class ConcurrentDouble {
public double num = 0;
public void subtract(double num) {
this.num -= num;
}
public void add(double num) {
this.num += num;
}
}
は今、私たちは数が0
でオフを開始知っています、最後に0
があることを期待しています。番号が-5.0
または5.0
になる可能性はありますか?
'num'をvolatile化した場合はどうなりますか? – Wulf
あまり変わらないでしょう。 + =はアトミックではありません。書き込みは原子であることが保証されます。 –