2014-03-05 94 views
0

我將使用一個靜態變量的多線程。這個變量在線程運行時會被更新。更新過程將通過updateModel函數完成。這裏是我的代碼片段我的功能需要同步嗎?

public static int total = 0; 
... 
run(){ 
    // there will be calculation before update value ex: int ext = this.total/10 
    updateModel(); 
} 

synchronized void updatedModel(){ 
    this.total += 1; 
} 

updateModel是否需要同步?

+0

您是否真的必須在線程中更新總數? – hasan83

+0

是的,對於你們兩個人 –

+0

我建議你改用AtomicInteger。這種方式不需要同步。 – krems

回答

4

您在這裏做錯了,您正在使用this引用來同步靜態變量,因爲方法updatedModel()是實例。 It's not thread safe anyway!

使用靜態參考靜態內容同步,或使該方法updatedModel()靜態

+0

所以我需要添加靜態同步updateModel()? –

+0

@IniKoqApah:是的,這是一個可能的解決方案。 –

+1

謝謝,我剛剛讀了一些教程,這是java程序員最大的錯誤,忘記用靜態變量來表示需要同步的靜態變量 –

3

我將使用一個靜態變量的多線程。

是,該變量需要同步和好兆頭使用AtomicInteger.

保持這種方法,因爲它是。使變量線程安全。

1

當我記得沒錯,+=不是一個原子操作,因此它可以出現一個線程進入updateModel並讀取值42 ,然後上下文切換和另一個線程進入updateModel,讀取值42,它增加至43,然後上下文切換和第三線程進入updateModel,讀取值43,它增加至44,然後上下文切換和第一線程將值設置爲再次。所以,如果你想保證每個線程將值遞增1,你應該同步它。