2016-11-27 11 views
0

は、一例として、この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になる可能性はありますか?

+0

'num'をvolatile化した場合はどうなりますか? – Wulf

+0

あまり変わらないでしょう。 + =はアトミックではありません。書き込みは原子であることが保証されます。 –

答えて

3

はい、可能です。 -=および+=はアトミック操作ではありません。それでも、JVMはdoubleへの書き込みがアトミックであることを保証しません。

+0

これは同期なしでは不可能ですか? – Wulf

+0

基本的には、 JDKにはDoubleAdderクラスがありますが、それは非常に複雑です。それを使用しますが、あなたの定義を試みません。または、同期を使用してください。 –

+0

何がそんなに複雑ですか? – shmosel

関連する問題