不可能的Java内存一致性错误

时间:2014-11-09 18:18:15

标签: java multithreading swing memory

首先,我不是英语为母语的人,所以我为任何最终的“怪异”写作道歉。

我正在Eclipse上开发一个更新Jpanel的Swing Java应用程序。这个面板包含几个子面板,并且我不断地切换面板“模式”,正好是MouseListener发生了变化,因此它们以稍微不同的方式响应用户鼠标输入。

无论应用程序做什么,它都会发生错误,似乎对我没有合理的解释。在我的代码中的某些时候,我尝试将面板更新为我称之为neutralMode的内容。这种情况发生在以下方法中:

//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;
}

此更新无效(对neutralMode()的调用不会执行预期的操作)。然而,对queryPatternMode()的调用(在右下方的注释中)完美地运行。所以我决定COPY queryPatternMode()的主体并将它粘贴在neutralMode()的身体上,相同的!它仍然没有用!

方法代码如下:

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()等于零)。但是,当我调用queryPatternMode()时,集合恰好具有预期的大小(20个面板)。但是这两种方法都是相同的,并且都是从同一个地方调用!!!

它可能是什么???有没有可能的解释??

1 个答案:

答案 0 :(得分:1)

它看起来像是同步问题。 您应该检查有多少线程正在访问集合'面板'

这只是一个运气,它一直适用于queryPatternMode(),而不是MIDMode()。在另一个晴朗的日子,它可能是另一种方式。