gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:08:39 25 4
gpt4 key购买 nike

以下是我创建的对象上的两种方法。父类(super class)已经实现了 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 处放置了断点任务,他们从来没有达到。

但是,如果我在调用这两个函数的位置放置一个断点,调试器就会到达它并进行调用。

谁能告诉我我错过了什么?

最佳答案

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

您需要同步 访问这个变量。您有几个不同的选择:

  • 将其声明为 volatile
  • 使用来自 java.util.concurrent 的一些高级构造包(如 AtomicBoolean)
  • 使用 synchronized 同步对变量的访问关键词。


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

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

    进一步阅读:
  • Java Language Specification: Threads and Locks
  • 关于只有在调用 System.out.println 时才会调用 Java 覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040821/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com