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

标签 java multithreading swing memory

首先,我的母语不是英语,所以我对最终的“奇怪”写作表示歉意。

我正在 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/

相关文章:

java - 在 Spring Security 4 中获取初始请求的 url

c++ - 为什么我的日志库会导致性能测试运行得更快?

java - Java8的Collection.parallelStream如何工作?

c# - 工作线程中 Excel Interop 的性能缓慢

java - 如何解决 "Neither Jetty ALPN nor OpenSSL via netty-tcnative were properly configured"?

java - 数据库全文检索

java - ArrayList未初始化

Java 树节点 : How to prevent getChildCount from doing expensive operation?

java - Java Swing 中带有自定义事件的接口(interface)之后的 .class

java - 使用 AbstractTableModel for JTable 时换行符 (\n) 不起作用