2011-11-15 36 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