【发布时间】:2015-05-13 16:11:52
【问题描述】:
我有这段代码:
void timerCountDown(){
while(RaftNode.getTimeoutVar()){
long x = System.currentTimeMillis();
if(x >= RaftNode.limit){
System.out.println(x);
System.out.println(RaftNode.limit + " THIS SHOULD BE LESS THAN");
System.out.println(System.currentTimeMillis() + " THIS");
System.out.println("TIMED OUT");
raft.RaftNode.setTimeoutVar(false);
nextRandomTimeOut();
raft.RaftNode.onTimeOut();
}
}
}
所以基本上,这是一个超时功能,超时由另一个条件刷新。我的问题是,即使 x >= RaftNode.limit 条件为假(通过打印语句),它也会不断触发。
我的控制台输出:
1431532870542
1431532872508 THIS SHOULD BE LESS THAN
1431532870542 THIS
所以x确实是当前时间,但即使小于限制,条件也被触发了。
我不知道为什么!
限制变量是
public static long limit;
这里没什么特别的
【问题讨论】:
-
这是在多线程环境中运行的吗?
-
你在使用线程吗?共享变量值的更新可以延迟。使
limitvolatile 左右。 -
按照@JoopEggen 的建议,尝试将
public static long limit;更改为public voliatile static long limit; -
将限制设为
public staticfinallong limit;。如果编译器随后在某处抱怨,这个“某处”可能会引导您找到答案。 -
这基本上是线程问题,搜索java
volatile会更进一步。相当愚蠢,但线程可以具有由另一个线程更改的某些变量的陈旧值。使用volatile,编译器通过额外的代码确保线程获得更新的值。将变量值复制到线程中可能被视为优化问题。但是再看看 JIT,LL2 缓存等等。
标签: java if-statement java-7