2011-11-15 72 views
1

我有一個全局變量的類,整數時鐘,初始化爲0.它傳遞'時鐘'幾個線程構造函數,也啓動線程。看起來線程中可以看到'時鐘'的增量,但在調用過程中,'clock'始終是0.因爲Integer是一個對象,對象是通過引用傳遞的,所以我期望看到'clock'的更改到處。這不是這種情況嗎?通過引用傳遞整數與線程

+1

Java是*通過值* - 特別是*參考值*。除此之外,'Integer'(實際上,所有的自動裝箱類)是不可變的;你不能改變它。 –

回答

5

使用AtomicInteger,而不是一個Integer

可以自動更新的值int。有關原子變量屬性的描述,請參閱java.util.concurrent.atomic包規範。 AtomicInteger用於原子增量計數器等應用程序,不能用作Integer的替代品。但是,該類不會擴展Number以允許使用基於數字的類的工具和實用程序進行統一訪問。

+0

另一個我不知道存在的圖書館... –

+1

這不是圖書館。它是Java SE的一部分。 –

0

Integer不可變的對象,因此您無法從其他線程更改其值。而且,因爲在線程中使用它時必須聲明final,所以不能重新分配變量。

解決的辦法是創建一個Integer包裝,是可變的

class MutableInteger { 
    private int integer; 

    synchronized void setInteger(int integer) { ... } 
    synchronized int getInteger() { ... } 
} 
+0

杜,忘了。但是用int字段創建一個Clock對象並調用increment()會工作正確嗎? – Rooster

+0

是的,如果您正在從多個線程寫入/讀取,您應該使用'synchronized'修飾符來保持線程安全。 –

+0

好的,這與我的Clock對象相似。謝謝! – Rooster