2012-02-06 50 views
7

說我有下面的代碼:當決定使用易失性時,實際的鎖是否重要?

private Integer number; 
private final Object numberLock = new Object(); 

public int get(){ 
    synchronized(number or numberLock){ 
     return Integer.valueOf(number); 
    } 
} 

我的問題是,做add方法以下版本需要有number揮發性在下面的情況:

public void add(int num){ 
    synchronized(number) 
     number = number + num; 
} 

public void add(int num){ 
    synchronized(numberLock) 
     number = number + num; 
} 

我知道這些都是原子操作,但我的問題是,價值是numberguarennteed被推送到全局內存,並可以在不使用volatile的情況下對所有線程可見?

+0

在數字上同步可能不是一個好主意,Integer對象(可以)被緩存,所以這會阻止其他代碼在同一個數字上同步。 – Jim 2012-02-06 15:44:49

+0

@Jim真的,只是想做一個簡單的例子:) – Shawn 2012-02-06 15:46:05

回答

10

是數字值保證被推送到全局內存和所有線程可見而不使用易失性?

是的。同步也提供可見性。實際上,同步提供了可見性和原子性,而只有易見性。

+0

好吧,謝謝 – Shawn 2012-02-06 15:55:59

+3

+1:'synchronized'可以使'volatile'成爲多餘的,但不是相反。 – 2012-02-06 16:24:56

+1

@Eugene:erf,這裏對我來說日子很慢,但是...等一下:我在* get *方法中看不到* synchronized *。 OP將需要同步* get *和* add *,否則它將無法工作。 AFAICT(但對我來說這是一個緩慢的日子)OP的例子中既沒有可見性也沒有原子性,看到* get *根本就沒有使用同步機制...... – TacticalCoder 2012-02-06 16:44:43

1

您還沒有同步得到那麼你的代碼是不是線程安全的:

public int get(){ 
    return Integer.valueOf(number); 
} 

除此之外,同步將確保能見度尤金已經指出。

+0

好趕 - 加 – Shawn 2012-02-06 18:07:19

相關問題