Java 我的getter赢了';不要给出更新的变量
我试图将一个变量传递给另一个类,但我的getter不会发送变量的更新值,而是发送我用来初始化它的值 主要类别:Java 我的getter赢了';不要给出更新的变量,java,getter-setter,Java,Getter Setter,我试图将一个变量传递给另一个类,但我的getter不会发送变量的更新值,而是发送我用来初始化它的值 主要类别: OtherClass otherclass = new OtherClass(new Main()); private boolean updateVar = true private int timer = 0; public void tick(){ if(updateVar == true) timer++; }
OtherClass otherclass = new OtherClass(new Main());
private boolean updateVar = true
private int timer = 0;
public void tick(){
if(updateVar == true) timer++;
}
public int getTimer(){
return timer;
}
其他类别:
Main main;
private int holdTimer;
public OtherClass(Main main){
this.main = main;
holdTimer = this.main.getTimer();
System.out.println(holdTimer);
}
每次结果都是0,有人能帮忙吗?我的线程每秒都在调用我的tick(),以防您感到奇怪。如果您希望成员变量递增,则需要调用
tick()
。因为您在另一个线程中调用tick()
,您已经进入了并发和线程安全的黑暗世界
简单地说,在一个线程中所做的更改不一定对其他线程可见,除非您遵循一些严格的规则:
- 使字段
不稳定
- 必须同步对它的所有访问
如果主线程中没有等待循环,您可能还必须
join()
更新线程以等待它完成。“每次它显示为0时,有人能帮忙吗?”
--什么是“每次”。在代码中只调用一次。请显示您用来测试它的真实代码。什么叫tick()?我看不出您在哪里更改它。不需要在问题标题中添加标记。所以我们已经有了标签系统。看一看。我的线程正在调用它。我没有显示它,因为这将是一个有点不必要的抱歉that@NGSoftware:不必要?认真地这是钥匙。如果不显示它,我们将无能为力。@NGSoftware如果要在几个线程中使用同一变量,则应将其声明为volatile
,以防止每个线程对其进行缓存。
private volatile int timer = 0;
public synchronized void tick(){
if(updateVar == true) timer++;
}
pubic synchronized int getTimer(){
return timer;
}