【问题标题】:Java 7: IF condition triggered when falseJava 7:为假时触发 IF 条件
【发布时间】: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;

这里没什么特别的

【问题讨论】:

  • 这是在多线程环境中运行的吗?
  • 你在使用线程吗?共享变量值的更新可以延迟。使limit volatile 左右。
  • 按照@JoopEggen 的建议,尝试将public static long limit; 更改为public voliatile static long limit;
  • 将限制设为public static final long limit;。如果编译器随后在某处抱怨,这个“某处”可能会引导您找到答案。
  • 这基本上是线程问题,搜索java volatile会更进一步。相当愚蠢,但线程可以具有由另一个线程更改的某些变量的陈旧值。使用volatile,编译器通过额外的代码确保线程获得更新的值。将变量值复制到线程中可能被视为优化问题。但是再看看 JIT,LL2 缓存等等。

标签: java if-statement java-7


【解决方案1】:

这只能是使用线程的问题。共享变量值的更新可以延迟。使限制不稳定。

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

(以 cmets 开始。)

【讨论】:

    【解决方案2】:

    你能试试下面的方法吗?

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

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 2015-08-20
      • 1970-01-01
      • 2023-04-04
      • 2021-12-09
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多