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

use*_*516 0 java swing multithreading 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);

    ...
Run Code Online (Sandbox Code Playgroud)

提前谢谢了.

Pac*_*ace 5

根据你所写的内容,不,这不会确保可见性(虽然我不知道如何声明任何易失性会有所帮助).在这个bug中,声明JDK 6文档中的许多方法错误地声明它们是线程安全的(参见页面底部),JEditorPane.setText是其中之一(因此该语句不在JDK 7文档中).