只有在调用System.out.println时才会调用Java覆盖方法

时间:2011-11-07 18:23:00

标签: java override mouselistener

以下是我创建的对象的两种方法。超类实现了MouseListener。

@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 :(得分:3)

这可能是由于不同的线程缓存了它们自己的mIsPushed变量值。

您需要同步对此变量的访问权限。您有几个不同的选择:

  • 将其声明为volatile
  • 使用java.util.concurrent包中的某些高级构造(例如AtomicBoolean
  • 使用synchronized关键字同步对变量的访问权限。

更详细:Java内存模型不保证来自一个线程的变量的读取将从另一个线程产生最后一个值写入到该变量。这是为了允许JVM优化Java程序的执行。添加System.out.println可以刷新缓存并在需要时加载新值。

要明确告诉JVM确保不应使用缓存值,您需要在write和read之间引入“之前发生”关系。

进一步阅读: