据说JLabel setText()方法是线程安全的,但它确保了可见性

时间:2013-02-07 11:35:51

标签: java multithreading swing visibility volatile

查看JLabel的源代码我关注文本字段的可见性。 我提取了必要部分来设置文本字段并检索oldValue。 我认为如果String文本字段未声明为volatile,则可见性存在危险,因为firePropertyChange可能看不到之前由另一个线程保存的文本字段中检索到的oldValue。 我是对的,还是我错过了什么? 请注意,这不是讨论SwingUtility。

public class JLabel extends JComponent implements SwingConstants, Accessible {
    ...

    private String text = "";         // "" rather than null, for BeanBox

    ...

    public void setText(String text) {

        String oldAccessibleName = null;
        if (accessibleContext != null) {
            oldAccessibleName = accessibleContext.getAccessibleName();
        }

        String oldValue = this.text;
        this.text = text;
        firePropertyChange("text", oldValue, text);

    ...

非常感谢提前。

1 个答案:

答案 0 :(得分:5)

根据你所写的内容,不,这不会确保可见性(虽然我没有看到声明任何易变的东西会有所帮助)。在this bug中,陈述JDK 6文档中的许多方法错误地声明它们是线程安全的(参见页面底部),JEditorPane.setText是其中之一(因此声明不在JDK 7文档)。