2011-11-07 49 views
2

以下是我創建的對象上的兩種方法。超類實現了MouseListener。只有在調用System.out.println時纔會調用Java重寫方法

@Override public void mousePressed(MouseEvent event){ 
    mIsPushed = true; 
    System.out.println("Button pushed"); 
    } 

    @Override public void mouseReleased(MouseEvent event){ 
    mIsPushed = false; 
    System.out.println("Button released"); 
    } 

當兩個System.out.println調用是註釋掉,程序工作正常,表現爲它應該。當他們不是時,它什麼也不做。我甚至在mIsPushed任務中放置了斷點,並且他們從未達到。

但是,如果我在調用這兩個函數的位置放置了一個斷點,則調試器會觸及它並進行調用。

誰能告訴我我錯過了什麼?

+1

請給一個簡短而完整的程序演示問題。我懷疑你正在做一些狡猾的事情,比如試圖從多個線程使用共享變量而沒有過時值的保護,但是我們不能說沒有看到更多的代碼。 –

+0

這也是我的選擇,因爲印刷聲明基本上是所有其他方面都沒有的。 – aioobe

回答

3

這可能是由於不同的線程緩存了mIsPushed變量的自己的值。你需要同步訪問這個變量。你有幾個不同的選擇:

  • 聲明爲volatile
  • 使用一些高級別從java.util.concurrent封裝構造(如AtomicBoolean
  • 使用​​關鍵字同步接入到變量。

的詳細信息:Java的內存模型並不能保證一個從一個線程讀取變量的會產生從另一個線程寫入該變量的最後一個值。這是爲了允許JVM優化Java程序的執行。添加System.out.println可能會刷新緩存並導致需要時加載新值。

要明確告訴JVM確保不應使用緩存值,則需要在寫入和讀取之間引入「發生之前」 - 關係。

延伸閱讀:

+0

謝謝大家的回覆。它會由多個線程引起的可能性不會,但應該會發生在我身上。我在所有關聯的方法上添加了同步並解決了問題。 –

+0

沒問題。別客氣。 – aioobe

相關問題