2011-11-07 50 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

相关问题