0

我有这样的课程(删除了不相关的代码):

public final class Card {

    private boolean important;

    public boolean isImportant() {
        return important;
    }

    public void setImportant(boolean isImportant) {
        this.important = isImportant;
        fireIsImportantChangedEvent(isImportant);
    }

    private EventListenerList listenerList = new EventListenerList();

    private void fireIsImportantChangedEvent(boolean newValue) {
        for (CardListener listener : listenerList.getListeners(CardListener.class)) {
            listener.isImportantChanged(new CardEvent<Boolean>(this, newValue));
        }
    }
}

我正在尝试使此类线程安全,但不确定是否需要同步访问重要(public synchronized boolean isImportant() { ... }public synchronized void setImportant(boolean isImportant) { ... })的任何方法,或者只是声明重要的易失性(private volatile boolean important;)。我的理解是,如果setImportant()不触发事件(如果它刚刚触发this.important = isImportant), volatile 会起作用,但如果我触发此事件, volatile 仍然会起作用吗?

4

1 回答 1

1

到目前为止,您不需要进行任何同步。事件处理似乎发生在同一个线程中,除非监听器启动新线程。如果是这种情况,您确实需要考虑可见性和同步性。

如果您希望其他线程读取重要值,则需要将其设为 volatile,否则它可能会被缓存以使其他线程看不到它。关于同步,如果侦听器调用的顺序无关紧要,我认为没有任何必要。如果您想保证从 false 到 true 再回到 false 的多线程更改首先触发所有 true,然后您需要同步所有 false 事件。到目前为止,同步 fire 方法就足够了,因为您正在传递 newValue,而不是从实例变量中重新读取它。

于 2012-11-25T21:52:45.660 回答