2014-02-21 36 views
0

如果我這樣做,我的程序工作很細:相同的條件邏輯在Java中爲AtomicBooleans生成兩個完全不同的字節代碼。爲什麼?

if (atomicBoolean1.get() == false && atomicBoolean2.get() == true 
    && !atomicBoolean1.compareAndSet(false, true)) { 

    continue; 
} 

現在,如果我這樣做,一切都打破了:

if (atomicBoolean1.get() == false && atomicBoolean2.get() == true) { 

    continue; 
} 

if (!atomicBoolean1.compareAndSet(false, true)) { 

    continue; 
} 

我是不是越來越瘋了嗎?

回答

3

continue跳轉到下一次迭代。

它們都不相同。同樣應該是

if (atomicBoolean1.get() == false && atomicBoolean2.get() == true) { 
    if (!atomicBoolean1.compareAndSet(false, true)) { 
     continue; 
    } 
} 
+0

哇!!!!!爲什麼?我有兩個分支而不是一個?從邏輯上講它是一樣的,所以現在我很困惑。 – JohnPristine

+0

現在你的兩個條件獨立工作。你必須把他們和另一個聯繫起來。 :) –

+0

@JohnPristine,當你做一個「繼續」,它不會去「下一行」。也許你誤解了「繼續」的說法。 – anonymous

0

其實你在上面的例子中並沒有完全相同的事情。

在情形1,

atomicBoolean1.get() == false && atomicBoolean2.get() == true 

如果上述2個條件滿足只,

atomicBoolean1.compareAndSet(false, true) 

功能正在呼叫。

但在案例2,

atomicBoolean1.get() == false && atomicBoolean2.get() == true 

如果上述兩個條件滿足後,它會回到循環的開始。 所以不會叫

atomicBoolean1.compareAndSet(false, true) 

如果這兩個條件只有失敗,它會調用

atomicBoolean1.compareAndSet(false, true) 

我想,我可能引起的任何問題。

讓我們更詳細地介紹您的計劃以及您正在嘗試做的事情。 這可能有助於找出問題。

相關問題