【问题标题】:JLabel setText() method is said to be threadsafe, but does it ensure visibilityJLabel setText() 方法据说是线程安全的,但它是否确保可见性
【发布时间】:2013-01-22 21:30:29
【问题描述】:

查看 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);

    ...

非常感谢。

【问题讨论】:

  • Please note this is not to discuss about SwingUtility.,没错,我同意了,为了更好的帮助,请尽快发布一个 SSCCE 简短的、可运行的、可编译的,仅 JFrame 和一个 JLabel
  • JLabel setText() 方法据说是线程安全的谁/什么说这样的废话?
  • 对不起,JTextPane 似乎有一个线程安全的 setText() 方法,但是它没有像 JLabel 那样查找的文本字段。但总的来说,上面的代码 sn-p 并不能确保跨多个线程的可见性,对吧?这将回答我的问题。
  • 我在 JDK7 文档中没有看到任何表明 JTextPane#setText 是线程安全的内容
  • 嗯,JTextPane 从 JEditorPane 继承 setText。对于 JDK6,文档说它是线程安全的。对于 JDK 7,它说不是。

标签: java multithreading swing visibility volatile


【解决方案1】:

根据您所写的内容,不,这不能确保可见性(尽管我不明白声明任何 volatile 会有什么帮助)。在this bug 中指出,JDK 6 文档中的许多方法错误地声明它们是线程安全的(见页面底部),JEditorPane.setText 就是其中之一(因此该声明不在 JDK 7 文档中的原因)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2011-06-03
    • 2013-03-01
    相关资源
    最近更新 更多