繁体   English   中英

线程之间的共享内存未更新

[英]Shared memory between threads not updating

我面临一个问题,即两个线程正在访问共享变量而无法查看最新更改。

我有一个GUI线程,该线程有一个文本框,一个鼠标单击侦听器,它记录了一次单击,创建了一个新线程,该线程将值注入到文本框中,当第二次单击鼠标时,将停止最后创建的线程,并创建一个新线程。将创建一个将同时注入值的对象,依此类推。

public class SomeGuiClass{
    private static boolean isRunning = false;
    private static boolean canRun = true;
    private Thread thread;     

    public SomeGuiClass(){
        txt.addMouseListener(new MouseListener() {
            @Override
            public void mouseDoubleClick(MouseEvent arg0) { 
                if (isRunning){
                    // force the thread to stop running.
                    canRun = false;

                    // waits for the thread to stop his run.
                    while(isRunning);
                }

                thread = new Thread(new Runnable() {
                    @Override
                    public void run() { 
                        SomeGuiClass.isRunning = true;          

                        while(SomeGuiClass.canRun){
                            // Inject values to text box, using Display.asyncExec...

                            Thread.sleep(1000);
                        }

                        SomeGuiClass.isRunning = false;
                    }
                });

                SomeGuiClass.canRun = true;
                thread.start();
            }
        }
    }
}

问题是,读取isRunning的GUI线程无法看到新线程执行的最后更新,从而导致while(isRunning)循环永远运行。

我尝试使用volatile,发生同样的事情。 看来我在做什么在逻辑上是正确的,只是缺少有关Java内存模型缺失方式的技术信息。

几点观察:

  • 您必须同时使isRunningcanRun ,以使其工作

  • 由于您的其他线程仅每1000毫秒检查一次canRun ,因此在处理对GUI线程的mouseDoubleClick的第二次调用之前,您可能仍会canRun很长时间。

  • 让线程忙于等待通常是一个非常糟糕的主意

    while(true){/*do nothing*/}循环。 您绝对应该使用等待/通知机制来在线程之间同步

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM