以下是我创建的对象的两种方法。超类实现了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
作业中放置了断点,但它们从未到达过。
但是,如果我在调用这两个函数的位置放置一个断点,调试器会到达它并进行调用。
谁能告诉我我错过了什么?
答案 0 :(得分:3)
这可能是由于不同的线程缓存了它们自己的mIsPushed
变量值。
您需要同步对此变量的访问权限。您有几个不同的选择:
volatile
java.util.concurrent
包中的某些高级构造(例如AtomicBoolean
)synchronized
关键字同步对变量的访问权限。更详细:Java内存模型不保证来自一个线程的变量的读取将从另一个线程产生最后一个值写入到该变量。这是为了允许JVM优化Java程序的执行。添加System.out.println
可以刷新缓存并在需要时加载新值。
要明确告诉JVM确保不应使用缓存值,您需要在write和read之间引入“之前发生”关系。
进一步阅读: