我有这个代码:
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
so x确实是当前时间,但是即使它小于极限,情况也被触发。
我不知道为什么!
极限var是
public static long limit;
所以这里没有什么花哨的
使用线程只能是一个问题。共享变量的值的更新可以延迟。使极限波动左右。
这基本上是一个线程问题,对Java挥发性的搜索将进一步指向。相当愚蠢,但是线程可以具有另一个线程更改的变量的过时值。随着挥发性,编译器可以通过额外的代码确保线程获得更新值。该变量值被复制到线程中可能被认为是一个优化问题。但是也要看jit,ll2缓存等等。
(以注释开始。)
您可以尝试以下内容吗?
void timerCountDown(){
long limit = RaftNode.limit;
long raft_time = RaftNode.getTimeoutVar();
long x = System.currentTimeMillis();
while(raft_time){
x = System.currentTimeMillis();
if(x >= limit){
System.out.println(x);
System.out.println(limit + " THIS SHOULD BE LESS THAN");
System.out.println(x + " THIS");
System.out.println("TIMED OUT");
raft.RaftNode.setTimeoutVar(false);
nextRandomTimeOut();
raft.RaftNode.onTimeOut();
}
raft_time=RaftNode.getTimeoutVar();
}
}