首先,我的母语不是英语,所以我对最终的“奇怪”写作表示歉意。
我正在 Eclipse 上开发一个 Swing Java 应用程序,用于更新 Jpanel。该面板包含几个子面板,我不断地切换面板“模式”,MouseListener 发生变化,因此它们以稍微不同的方式响应用户鼠标输入。
无论应用程序做什么,它都会发生一个对我来说似乎没有逻辑解释的错误。在我的代码中的某个时刻,我尝试将面板更新为我所说的中性模式。这发生在以下方法上:
//Guarded block (see http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html)
private synchronized boolean waitsForUserSatisfactionAnswer()
{
while(!userIndicatedSatisfaction)
{
try {
wait();
} catch (InterruptedException e) {}
}
userIndicatedSatisfaction = false; //reset for future new query
getObjectSetVisualizationPanel().neutralMode();
//getObjectSetVisualizationPanel().queryPatternMode();
return userSatisfied;
}
此更新不起作用(对中性模式()的调用没有达到预期的效果)。然而,对 queryPatternMode() 的调用(在下面的行中注释)工作得很好。所以我决定复制 queryPatternMode() 的主体并将其粘贴到中性模式() 的主体上,完全相同!但它仍然不起作用!
方法代码如下:
public void queryPatternMode()
{
System.out.println("Inside queryPatternMode!!!");
System.out.println("panels.size(): " + panels.size());
for (DigitalObjectPanel panel : panels)
{
System.out.println("Inside the loop!!!");
panel.resetBehavior();
panel.setQuerySelectionBehavior(gui);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
panel.validate();
}
});
}
}
public void neutralMode()
{
System.out.println("Inside neutralMode!!!");
System.out.println("panels.size(): " + panels.size());
for (DigitalObjectPanel panel : panels)
{
System.out.println("Inside the loop!!!");
panel.resetBehavior();
panel.setQuerySelectionBehavior(gui);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
panel.validate();
}
});
}
}
发生的情况是,当我调用neutralMode()时,“panels”集合恰好为空(panels.size()等于0)。然而,当我调用 queryPatternMode() 时,集合恰好具有预期大小(20 个面板)。但这两种方法是平等的,并且都是从同一个地方调用的!!!
这可能是什么???有什么可能的解释吗?
最佳答案
这绝对看起来像是同步问题。 您应该检查有多少线程正在访问集合“面板”。
幸运的是,它始终适用于queryPatternMode(),而不适用于neutralMode()。在另一个晴朗的日子里,情况可能会有所不同。
关于java - 不可能的Java内存一致性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831569/