Java 7:IF条件在false时触发

Java 7:IF条件在false时触发,java,if-statement,java-7,Java,If Statement,Java 7,我有一段代码: 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 L

我有一段代码:

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条件为false(通过print语句),它仍会继续触发

我的控制台输出:

1431532870542
1431532872508 THIS SHOULD BE LESS THAN
1431532870542 THIS
所以x确实是当前时间,但即使它小于极限,条件也会被触发

我不知道为什么

var的极限是

public static long limit;

所以这里没什么特别的

你能试试下面的吗

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();
    }
}

使用线程只能是一个问题。共享变量值的更新可能会延迟。使极限波动性左右


这基本上是一个线程问题,对java volatile的搜索将进一步指出这一点。相当愚蠢,但是线程可能会有一些变量的过时值被另一个线程更改。使用volatile,编译器使用额外的代码确保线程获得更新的值。将变量值复制到线程中可能被认为是一个优化问题。但是再看看JIT、LL2缓存等等


(以注释开头。)

这是在多线程环境中运行的吗?是否使用线程?共享变量值的更新可能会延迟。使
限制
易变。正如@JoopEggen建议的那样,尝试更改
公共静态长期限制至<代码>公共车辆静态长限使限制成为一个
公共静态
最终
长限制。如果编译器然后在某个地方抱怨,这个“某处”可能会引导您找到答案。这基本上是一个线程问题,搜索java
volatile
将进一步指出。相当愚蠢,但是线程可能会有一些变量的过时值被另一个线程更改。使用
volatile
编译器使用额外的代码确保线程获得更新的值。将变量值复制到线程中可能被认为是一个优化问题。但是再看看JIT、LL2缓存等等。