小编Whi*_*red的帖子

Java Swing EDT和并发

我只是想知道是否仍然需要确保invokeLater()Runnable的同步性.

我遇到了死锁,需要在保持并发性的同时克服它.

这是一个好代码的例子吗?:

private String text;

private void updateText()
{
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            synchronized(FrameImpl.this)
            {
                someLabel.setText(text);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

对于相当糟糕的示例感到抱歉,但我们必须假设它text被不同的线程修改,无法注入,并且依赖于正确的值.

这是正确的解决方案,还是通过将同步代码发送到未知的上下文中而无意中造成死锁问题?

谢谢.

java concurrency swing invokelater event-dispatch-thread

4
推荐指数
1
解决办法
1246
查看次数

从设计角度"泄漏这个"

警告:在构造函数中泄漏"this"

我一直在努力,我有一种唠叨的感觉,因为我的设计是错误的或不是最佳的.

我知道这个警告引起了我的注意,我允许访问可能未完全初始化的对象.

假设我需要一个具有HAS并且需要List(Frame(List list))的Frame.在List中,我可能想要做一些事情,比如add().为了确保Frame尽可能少地了解List(只有它有一个),我想从列表中访问包含的Frame(List HAS a Frame?).这看起来有点傻,但我有2个以上的List实现,它们将以不同的方式使用Frame.

为了确保我的代码正确使用,我需要在List的构造函数中使用Frame.我还需要在Frame的构造函数中使用List,因为它必须有一个:

public abstract class Frame {
    private final List list;

    public Frame(List list) {
        this.list = list;
        list.setFrame(this);
    }
}

public abstract class List {
    private Frame frame;

    protected final void setFrame(Frame frame) {
        this.frame = frame;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,这是一个糟糕的设计,还是我真的应该创建一些这样做的中间脚手架,甚至将脚手架留给用户?

谢谢!

java logic constructor this

2
推荐指数
1
解决办法
544
查看次数