Java 7:如果false时触发条件



我有这个代码:

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

最新更新