2016-11-27 76 views
0

藉此ConcurrentDouble類定義爲例:併發:改變一個變量與非同步方法

public class ConcurrentDouble { 

    public double num = 0; 

    public void subtract(double num) { 
    this.num -= num; 
    } 

    public void add(double num) { 
    this.num += num; 
    } 
} 

現在,如果我做了以下內容,

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 
    } 
} 

我們知道電話號碼在0開始了,我們預計它最後會有0。數字有可能變成-5.05.0

+0

如果我們使'num'變得不穩定? – Wulf

+0

不會有太大的改變。 + =不是原子的。寫入將被保證是原子,但。 –

回答

3

是的,這是可能的。 -=+=不是原子操作。即使如此,JVM也不保證寫入雙精度是原子的。

+0

所以這是不可能的,沒有同步? – Wulf

+0

基本上沒有。 JDK有一個DoubleAdder類,但它非常複雜。使用它,但不要嘗試定義你的。或者使用同步,就是這麼做的。 –

+0

這有什麼複雜的? – shmosel

相關問題