2015-05-13 2 views
5

у меня есть этот кусок кода:Java 7: IF условие срабатывает, когда ложные

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 

Так х действительно текущее время, но даже несмотря на это меньше предела, условие быть вызвано.

Я понятия не имею, почему!

Предел вар не

public static long limit; 

так ничего фантазии здесь

+1

Пытались ли вы присоединить отладчик? – StormeHawke

+1

Что-то, вероятно, изменит предел между сравнением и заявлением печати – Kon

+0

@bluebrain он печатает оба! –

ответ

1

Проблема может быть проблемой при использовании потоков. Обновление значений общей переменной может быть отложено. Сделайте лимит нестабильным или так.

В основном проблема с потоками, поиск по java volatile будет указывать дальше. Скорее глупо, но потоки могут иметь устаревшие значения некоторой переменной, измененной другим потоком. С volatile компилятор обеспечивает дополнительный код, который потоки получают обновленные значения. Эти значения переменных копируются в поток, которые могут рассматриваться как проблема оптимизации. Но тогда посмотрите на JIT тоже, кэш LL2 и так далее.

(начал в качестве комментариев.)

1

Не могли бы вы попробовать что-то вроде следующего?

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(); 
    } 
} 
Смежные вопросы