我有一个带有全局变量的类,整数时钟,初始化为0.它将'clock'传递给几个线程构造函数,同时启动线程。在线程中可以看到'clock'的增量,但在调用过程中,'clock'始终为0.因为Integer是一个对象而对象是通过引用传递的,所以我希望看到'clock'的变化到处。情况不是这样吗?
答案 0 :(得分:5)
使用AtomicInteger
代替Integer
。
可以原子方式更新的
int
值。有关原子变量属性的描述,请参阅java.util.concurrent.atomic
包规范。AtomicInteger
用于诸如原子递增计数器的应用程序中,不能用作Integer
的替代。但是,此类确实扩展Number
以允许通过处理基于数字的类的工具和实用程序进行统一访问。
答案 1 :(得分:0)
Integer
是不可变对象,因此您无法从其他线程更改其值。因为在线程中使用它时必须声明final
,所以无法重新分配变量。
解决这个问题的方法是为Integer
创建一个可变的包装器
class MutableInteger {
private int integer;
synchronized void setInteger(int integer) { ... }
synchronized int getInteger() { ... }
}