2015-05-13 44 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條件保持觸發,即使它是false(通過打印語句)。

我的控制檯輸出:

1431532870542 
1431532872508 THIS SHOULD BE LESS THAN 
1431532870542 THIS 

所以X的確是當前的時間,但即使它是小於限值時,將觸發條件。

我不知道爲什麼!

限VAR是

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